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

标签 python web2py subprocess

我有一个使用 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/

相关文章:

python - Selenium 获取新窗口的 session ID - Python

css - web2py 中 sqlform 提交按钮的 id

Python 3 : capture a matrix return from subprocess with Rscript

python - 子进程,从 STDOUT 读取时重复写入 STDIN (Windows)

python - PIL.Image到cv2:参数 'src'的预期Ptr <cv::UMat>

python - 如何在python中初始化一个二维字符串DataFrame数组

python - Python 缓存字节码 (pyc) 文件何时更新?

python - 使用 web2py 向外键添加空值时出现 IntegrityError

web2py - 如何关闭Web2py票务系统?

带有 shell=True : redirections and platform-independent subprocess killing 的 python 子进程