我有一个使用 wsgi 处理程序功能运行的 Apache2/web2py 服务器。在其中一个 Controller 中,我试图运行一个外部可执行文件来对 2 个文件执行一些处理。
我的方法是使用 subprocess
模块启动可执行文件。我已将代码简化为基本实现,但收效甚微。
from subprocess import *
p = Popen(("echo", "Hello"), shell=False)
ret = p.wait()
print "Process ended with status %s" % ret
当单独运行上面的代码(创建新文件并通过 python 命令行运行)时,它完全按照预期工作。
但是,一旦我将完全相同的代码放入我的 web2py Controller 中,外部进程就会停止工作。与上述示例中预期的返回代码 0 的进程不同,它始终返回 -6 并且“Hello”不会打印到 stdout
.
经过一些挖掘后,我发现 p.wait()
的负面结果暗示一个信号导致进程异常结束。而且,根据我发现的一些文档,-6 对应于 SIGABRT
信号。
我原以为这个信号是我的子进程中一些执行不当的代码的结果。 但是,因为这只是运行回显(并且因为它在 web2py 之外工作),所以我怀疑子进程是否正在发出信号。
是否有某些 web2py 限制/配置导致 Popen()
请求总是失败?如果是这样,我该如何修改我的逻辑,以便 Controller (或其他任何东西)实际上能够产生这个外部进程?
** 编辑:看起来 web2py 应用程序可能不喜欢子进程模块。根据回复a message reply in the web2py email group :
“你不应该在 web2py 应用程序中使用子进程(如果你真的需要,查看 admin/controllers/shell.py)但是你可以在从 shell 运行的 web2py 程序中使用它(web2py.py -R myprogram .py)。”
我将根据此处的说明检查一些选项,看看是否有任何解决方案。
最佳答案
最后,我能想到的最好办法是设置一个简单的 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 中从 Controller 调用子进程。
(请注意,这是对我项目中的代码进行的快速而粗略的简化。我尚未验证它是否处于工作状态,因此可能需要进行一些调整。)
关于python - 无法在 Web2py (SIGABRT) 中打开 Python 子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9564432/