无法在Web2py(SIGABRT)中打开Python子进程

无法在Web2py(SIGABRT)中打开Python子进程,python,web2py,subprocess,Python,Web2py,Subprocess,我有一个Apache2/web2py服务器正在使用wsgi处理程序功能运行。在其中一个控制器中,我试图运行一个外部可执行文件,对2个文件执行一些处理 我的方法是使用子流程模块启动可执行文件。我已经将代码简化为一个简单的实现,但收效甚微 from subprocess import * p = Popen(("echo", "Hello"), shell=False) ret = p.wait() print "Process ended with status %s" % ret 单独运行上述

我有一个Apache2/web2py服务器正在使用wsgi处理程序功能运行。在其中一个控制器中,我试图运行一个外部可执行文件,对2个文件执行一些处理

我的方法是使用
子流程
模块启动可执行文件。我已经将代码简化为一个简单的实现,但收效甚微

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
信号

我本以为这个信号是我的子进程中执行不良代码的结果。然而,由于这只是运行echo(而且它在web2py之外工作),我怀疑子进程是否在发送信号

是否存在导致
Popen()
请求总是失败的web2py限制/配置?如果是这样,我如何修改我的逻辑,使控制器(或任何东西)能够实际生成这个外部进程

**编辑:看起来web2py应用程序可能不喜欢子流程模块。根据对以下问题的答复:

您不应该在web2py应用程序中使用子流程(如果确实需要,请查看admin/controllers/shell.py),但可以在从shell运行的web2py程序(web2py.py-R myprogram.py)中使用它


我将根据此处的说明查看一些选项,看看是否有任何解决方案出现。

最后,我所能想到的最好方法是设置一个简单的XML RPC服务器并从中调用函数:

my_server.py

web2py\u controller.py

老实说,我既不是Python专家,也不是SimpleRPCServer专家,因此总体代码可能达不到最佳实践标准。然而,实际上,走这条路线确实允许我从web2py中的控制器调用子流程


(注意,这是对我在项目中的代码的快速而肮脏的简化。我还没有验证它是否处于工作状态,因此可能需要一些调整。)

我也有同样的问题。你的回答很好,但我想知道什么可能会用
SIGABRT
截取进程,我如何识别它?@derrend-老实说,我不知道是什么原因造成的。我猜想这与web2py劫持python运行时的方式有关。从我记得的源代码来看(这是很久以前的事了),web2py在自己的专门范围内对代码有效地运行了一个巨大的
exec
。我不知道细节,但也许这个范围对Popen有敌意?如果你真的很好奇,我推荐你的邮件列表。web2py创建者在那里非常活跃。@derrend-刚刚意识到你是在Django而不是web2py上。我不熟悉Django的内部结构,但我认为可能是Django的操作与web2py类似,或者可能是从Web服务器旋转的进程启动子进程时出现了问题。值得一提的是,我最初是通过Apache/wsgi运行我的应用程序的。也许那就是罪魁祸首?
#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

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