我運行一個以「命令」模式運行軟件的子進程。 (如果您知道該軟件,則該軟件爲The Foundy的Nuke)在python子進程運行時與它進行通信
在命令模式下,此軟件正在等待用戶輸入。這種模式允許創建沒有任何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中運行核彈這裏發送相同的命令是我所得到的:
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/$
任何想法,爲什麼標準輸入不正確發送的命令? 感謝
-1。子過程模塊_is_用於交互式通信。對於非交互式案例,您將使用'os.system' – tobyodavies
當存在複雜的輸出和輸入交互時,會出現問題,以便使用子過程使用的管道填充。在簡單情況下,子進程將完成這項工作(當然,關於缺失換行符的答案也是正確的)。我只是說,如果它變得毛茸茸的話,子進程最終可能會超出其極限。 – torek