【发布时间】:2017-04-27 22:34:55
【问题描述】:
我想做什么
我有一个生成输出的前端系统。我正在使用瓶子通过发布请求访问此数据(JSON)。我的帖子毫无问题地收到了 json。我需要执行一个后端 python 程序(blender 自动化)并将这个 JSON 数据传递给那个程序。
我尝试过的事情
Subprocess
- 使用 subprocess 调用程序并传递输入。从外观上看似乎可以执行,但是当我检查系统监视器时,程序没有启动,但我的服务器继续按应有的方式运行。当独立于服务器执行时,此子进程命令运行得非常好。blender、script 和 json 都是具有绝对文件路径
的字符串对象sub = subprocess.Popen([blender + " -b -P " + script + " -- " + json], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)
C 风格 os.fork()
- 与上面相同,我发现阅读 pydoc 子进程使用这些方法进行操作双分叉
- 从这里的帖子尝试从服务器分叉,然后从该分叉调用子进程并终止子进程的父进程以创建一个孤儿。我的子进程命令仍然没有执行并且永远不会出现在系统监视器中。我需要什么
我需要一个解决方案,该解决方案将在自己的进程中从瓶服务器运行。它将处理多个请求,因此子进程不会在服务器中阻塞。被调用的过程是完全自动化的,只需要在执行命令中发送 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 并删除标准输出,stderr=PIPE 允许我看到我抛出未处理异常的输出,因为我的 json 数据是一个列表而不是字符串。
【问题讨论】:
-
我很好奇:是什么让您认为您需要一个单独的流程?
-
@ron.rothman tbh 我认为这是处理这个问题的正确方法。
-
我尝试不带子进程直接运行,还是不行。
标签: python-3.x subprocess bottle