2012-04-30 96 views
2

我運行一個以「命令」模式運行軟件的子進程。 (如果您知道該軟件,則該軟件爲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/$ 

任何想法,爲什麼標準輸入不正確發送的命令? 感謝

回答

3

您的代碼將文本發送

import nukeprint nukequit() 

沒有換行,從而蟒蛇實例不會嘗試執行任何東西,一切都只是坐在一個緩衝等待換行符

0

subprocess模塊不適用於交互式與進程的通信。在最好的情況,你可以給它一個預先計算的標準輸入字符串,然後讀取其輸出和錯誤:

p = Popen(..., stdin=PIPE, stdout=PIPE, stderr=PIPE) 
out, err = p.communicate(predefined_stdin) 

如果你確實需要互動的,可以考慮使用pexpect

+0

-1。子過程模塊_is_用於交互式通信。對於非交互式案例,您將使用'os.system' – tobyodavies

+1

當存在複雜的輸出和輸入交互時,會出現問題,以便使用子過程使用的管道填充。在簡單情況下,子進程將完成這項工作(當然,關於缺失換行符的答案也是正確的)。我只是說,如果它變得毛茸茸的話,子進程最終可能會超出其極限。 – torek

相關問題