如何写入Pythonsubprocess的标准input?

我正在尝试编写一个启动subprocess的Python脚本,并写入subprocess标准input。 如果subprocess崩溃,我也希望能够确定要采取的行动。

我试图启动的过程是一个名为nuke的程序,它有自己的内置版本的Python,我希望能够提交命令,然后在命令执行后告诉它退出。 到目前为止,我已经知道,如果我在命令提示符下启动Python,然后启动nuke作为subprocess,那么我可以键入命令来进行nuke ,但是我希望能够将这些全部放入脚本中主Python程序可以开始nuke ,然后写入其标准input (从而写入其内置版本的Python),并告诉它做些时髦的事情,所以我写了一个脚本,像这样开始nuke

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

然后没有任何反应,因为nuke正在等待用户input。 我现在怎么写标准input?

我这样做是因为我正在运行一个nuke插件,导致它在渲染多个帧时间歇性地崩溃。 所以我希望这个脚本能够开始nuke ,告诉它做些什么,然后如果崩溃,再试一次。 所以,如果有一个方法来赶上崩溃,仍然可以,那就太好了。

使用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] 

“更好”,因为这个警告:

使用communications()而不是.stdin.write,.stdout.read或.stderr.read来避免由于任何其他OSpipe道缓冲区填满和阻塞subprocess而导致的死锁。

你可以提供一个类似于文件的对象给subprocess.call()stdin参数。

Popen对象的文档适用于此处。

要捕获输出,应该使用subprocess.check_output() ,它采用类似的参数。 从文档:

 >>> subprocess.check_output( ... "ls non_existent_file; exit 0", ... stderr=subprocess.STDOUT, ... shell=True) 'ls: non_existent_file: No such file or directory\n' 
Interesting Posts