如何写入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'