Невозможно открыть подпроцесс Python в Web2py (SIGABRT) - PullRequest
3 голосов
/ 05 марта 2012

У меня сервер Apache2 / web2py, работающий с использованием функции обработчика wsgi. В одном из контроллеров я пытаюсь запустить внешний исполняемый файл, чтобы выполнить некоторую обработку 2 файлов.

Мой подход к этому заключается в использовании модуля subprocess для запуска исполняемого файла. Я упростил код до простой реализации с небольшим успехом.

from subprocess import *
p = Popen(("echo", "Hello"), shell=False)
ret = p.wait()
print "Process ended with status %s" % ret

При запуске вышеприведенного кода самостоятельно (создание нового файла и запуск через командную строку python) он работает точно так же, как и ожидалось.

Однако, как только я помещаю точно такой же код в мой контроллер web2py, внешний процесс перестает работать. Вместо процесса, возвращающегося с кодом 0 , как ожидается в приведенном выше примере, он всегда возвращает -6 , и «Hello» не печатается в stdout.

После некоторого копания я обнаружил, что отрицательные результаты p.wait() означают, что сигнал вызвал ненормальное завершение процесса. И, согласно некоторым документам, которые я нашел, -6 соответствует сигналу SIGABRT.

Я ожидал, что этот сигнал будет результатом какого-то плохо выполненного кода в моем дочернем процессе. Однако , поскольку только выполняет эхо (и поскольку оно работает вне web2py), у меня есть сомнения, что дочерний процесс сигнализирует сам о себе.

Есть ли ограничение / конфигурация web2py, из-за которых Popen() запросы всегда терпят неудачу? Если да, то как я могу изменить свою логику, чтобы контроллер (или что-то еще) действительно мог порождать этот внешний процесс?

** EDIT: похоже, приложениям web2py может не понравиться модуль подпроцесса. Согласно ответу на ответ на сообщение в почтовой группе web2py :

"Вы не должны использовать подпроцесс в приложении web2py (если вам это действительно нужно, посмотрите в admin / controllers / shell.py), но вы можете использовать его в программе web2py, запущенной из оболочки (web2py.py -R myprogram .py). "

Я буду проверять некоторые варианты, основываясь на примечании, здесь и посмотрим, будет ли какое-либо решение представлено.

1 Ответ

2 голосов
/ 10 апреля 2012

В конце концов, лучшее, что я смог придумать, - это настройка простого XML-сервера RPC и вызов функций из этого:

my_server.py

#my_server.py
from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler
from subprocess import *

proc_srvr = xmlrpclib.ServerProxy("http://localhost:12345")

def echo_fn():
    p = Popen(("echo", "hello"), shell=False)
    ret = p.wait()
    print "Process ended with status %s" % ret
    return True  # RPC Server doesn't like to return None

def main():
    server = SimpleXMLRPCServer(("localhost", 12345), ErrorHandler) 
    server.register_function(echo_fn, "echo_fn")
    while True:
        server.handle_request()

if __name__ == "__main__":
    main()

web2py_controller.py

#web2py_controller.py

def run_echo():
    proc_srvr = xmlrpclib.ServerProxy("http://localhost:12345")
    proc_srvr.echo_fn()

Честно говоря, я не Python и не гуру SimpleRPCServer, поэтому общий код может быть не лучшимстандарты практики.Однако, идя по этому пути, я действительно смог вызвать подпроцесс из контроллера в web2py.

(Обратите внимание, это было быстрое и грязное упрощение кода, который есть в моем проекте. У меня естьне подтвержден, он находится в рабочем состоянии, поэтому может потребоваться некоторые настройки.)

...