从瓶子Web服务器执行长时间运行的作业

时间:2017-04-02 06:50:41

标签: python-3.x subprocess bottle

我想做什么

我有一个正在生成输出的前端系统。我正在使用瓶子发布请求来访问此数据(JSON)。我的帖子没有问题就收到了json。我需要执行一个后端python程序(blender automation)并将这个JSON数据传递给该程序。

我试图做什么

子进程

- 使用子进程调用程序并传递输入。在外观似乎执行,但当我检查系统监视器时,程序没有启动,但我的服务器继续运行它应该。独立于服务器执行时,此子进程命令运行完全正常。

blender,script和json都是绝对文件路径的字符串对象

sub = subprocess.Popen([blender + " -b -P " + script + " -- " + json], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)

C样式os.fork()

- 与上面相同,我发现读取子进程使用这些方法操作的pydoc

Double Fork

- 从这里发布的帖子尝试从服务器分叉,然后从该fork调用subprocess并终止子进程的父进程以创建一个孤儿。我的子进程命令仍然不执行,并且从不在系统监视器中显示。

我需要什么

我需要一个能够在自己的流程中从瓶子服务器运行的解决方案。它将处理多个请求,因此子进程无法在服务器中阻塞。被调用的进程是完全自动化的,只需要在执行命令中发送JSON数据。子进程程序的结果将是在服务器上创建的文件的字符串路径。

从我的测试驱动程序调用时,上面的子进程工作得很好。我只需要将执行连接到web服务,这样我的前端就可以触发它的执行。

我的瓶贴方法 - 在没有问题的情况下打印json。

@post('/getData')
def getData():
    json_text = request.json
    print(json_text)

我不知道从哪里开始。从我到目前为止所读到的,子进程应该工作。任何帮助或建议将非常感谢。如果需要其他信息,请告诉我。我将编辑更多细节。谢谢。

相关资料: 操作系统:Ubuntu 16.04 LTS, Python 3.x

*编辑

这不是一个优雅的解决方案,但我的子进程调用现在可以正常工作。

cmd = blender
cmd += " -b -P "
cmd += script
cmd += " -- "
cmd += str(json)
sub = subprocess.Popen([cmd], shell=True)

似乎通过设置shell = True并删除stdout,stderr = PIPE允许我看到输出我抛出未处理的异常,因为我的json数据是一个列表而不是字符串。

1 个答案:

答案 0 :(得分:1)

当使用python执行脚本时,Popen.subprocess创建的进程将无意中继承并保持打开文件描述符。

您需要关闭它,以便该过程可以独立运行。的(close_fds = TRUE)

Stored Connection : Local instanse Mysql57 
Connectiton Method : Standart TCP/IP

Alsso,你不必使用shell来创建另一个进程。它可能有意外consequences

我有完全相同的问题,瓶子没有返回/挂起。它现在有效。