我运行一个以“命令”模式运行软件的子进程。 (如果您知道该软件,该软件是The Foundy的Nuke)
在命令模式下,该软件正在等待用户输入。此模式允许在没有任何UI的情况下创建合成脚本。
我已经完成了启动进程的这段代码,找到应用程序完成时的启动然后我尝试向进程发送一些命令,但是stdin似乎没有正确地发送命令。
这里是我测试此过程的示例代码。
import subprocess
appPath = '/Applications/Nuke6.3v3/Nuke6.3v3.app/Nuke6.3v3' readyForCommand = False
commandAndArgs = [appPath, '-V', '-t']
commandAndArgs = ' '.join(commandAndArgs)
process = subprocess.Popen(commandAndArgs,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
shell=True, )
while True:
if readyForCommand:
print 'trying to send command to nuke...'
process.stdin.write('import nuke')
process.stdin.write('print nuke')
process.stdin.write('quit()')
print 'done sending commands'
readyForCommand = False
else:
print 'Reading stdout ...'
outLine = process.stdout.readline().rstrip()
if outLine:
print 'stdout:', outLine
if outLine.endswith('getenv.tcl'):
print 'setting ready for command'
readyForCommand = True
if outLine == '' and process.poll() != None:
print 'in break!'
break
print('return code: %d' % process.returncode)
当我在shell中运行nuke并在此处发送相同的命令时,我得到的是:
sylvain.berger core/$ nuke -V -t
[...]
Loading /Applications/Nuke6.3v3/Nuke6.3v3.app/Contents/MacOS/plugins/getenv.tcl
>>> import nuke
>>> print nuke
<module 'nuke' from '/Applications/Nuke6.3v3/Nuke6.3v3.app/Contents/MacOS/plugins/nuke/__init__.pyc'>
>>> quit()
sylvain.berger core/$
知道为什么stdin没有正确发送命令? 感谢
答案 0 :(得分:3)
您的代码将发送文本
import nukeprint nukequit()
没有换行符,因此python实例不会尝试执行任何操作,一切都只是坐在缓冲区中等待换行符
答案 1 :(得分:0)
subprocess
模块不适用于与进程的交互式通信。充其量,你可以给它一个预先计算的标准输入字符串,然后读取它的标准输出和stderr:
p = Popen(..., stdin=PIPE, stdout=PIPE, stderr=PIPE)
out, err = p.communicate(predefined_stdin)
如果您确实需要互动,请考虑使用pexpect。