一尘不染

如何写入Python子进程的stdin?

python

我正在尝试编写一个Python脚本来启动一个子进程,并将其写入子进程stdin。我还希望能够确定子进程崩溃时要采取的措施。

我试图启动的过程是一个名为的程序nuke,它具有自己的Python内置版本,我希望能够向其提交命令,然后告诉其在命令执行后退出。到目前为止,我已经得出结论,如果我在类似这样的命令提示符下启动Python,然后nuke作为子进程启动,那么我可以在中键入命令nuke,但是我希望能够将其全部放入脚本中,以便Python程序可以启动nuke,然后写入其标准输入(并因此写入其内置版本的Python),并告诉它执行令人讨厌的事情,因此我编写了一个如下所示的脚本nuke:

subprocess.call(["C:/Program Files/Nuke6.3v5/Nuke6.3", "-t", "E:/NukeTest/test.nk"])

然后什么也没有发生,因为nuke正在等待用户输入。我现在将如何写入标准输入?

我这样做是因为我正在运行一个带有nuke该插件的插件,导致它在渲染多个帧时间歇性崩溃。因此,我希望此脚本能够启动nuke,告诉它执行某些操作,然后如果崩溃,请重试。因此,如果有一种方法可以捕获崩溃并且仍然可以,那么那就太好了。


阅读 518

收藏
2020-02-21

共1个答案

一尘不染

最好使用communicate

from subprocess import Popen, PIPE, STDOUT
p = Popen(['myapp'], stdout=PIPE, stdin=PIPE, stderr=PIPE)
stdout_data = p.communicate(input='data_to_write')[0]

“更好”,因为此警告:

请使用communication()而不是.stdin.write,.stdout.read.stderr.read来避免死锁,因为其他任何OS管道缓冲区中的任何一个都会填满并阻塞子进程。

2020-02-21