У меня сервер 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). "
Я буду проверять некоторые варианты, основываясь на примечании, здесь и посмотрим, будет ли какое-либо решение представлено.