2012-07-31 85 views
0

我的問題是這樣的 - 我需要從一個子進程得到輸出,我使用下面的代碼來調用它 - (隨意忽略冗長的參數。標準輸出= subprocess.PIPE)Python Popen不像一個子進程

 (stdout, stderr) = subprocess.Popen([self.ChapterToolPath, "-x", book.xmlPath , "-a", book.aacPath , "-o", book.outputPath+ "/" + fileName + ".m4b"], stdout= subprocess.PIPE).communicate() 
     print stdout 

由於下面一個答案,我已經能夠得到程序的輸出,但我還是最終等待進程結束之前,我得到任何東西。有趣的是,在我的調試器中,有各種文本在控制檯中飛行,並且全部被忽略。但是,當任何事情以黑色寫入控制檯的時候(我正在使用pycharm),程序仍然沒有問題。主程序能否等待某種輸出以便繼續前進?這是有道理的,因爲我正在嘗試與它進行通信......在控制檯中可以看到的文本和使其進入stdout的實際文本之間有區別嗎?我將如何收集寫入控制檯的文本?

謝謝!

+0

簡單地說 - 你不應該使用'subprocess.Popen()'得到相同的結果。請提供足夠的示例來重現此次調用的問題。 – 2012-07-31 15:28:00

回答

2

the documentation for subprocess.call()第一行把它描述爲這樣:

運行由ARGS中描述的命令。等待命令完成,然後返回returncode屬性。

因此,它必須等待子流程退出。

subprocess.Popen()相比之下,不會這樣做,返回一個處理過程,其中一個過程比communicate()

1

要想從一個程序中的所有輸出:

from subprocess import check_output as qx 

output = qx([program, arg1, arg2, ...]) 

爲了讓輸出的程序運行時:

from subprocess import Popen, PIPE 

p = Popen([program, arg1, ...], stdout=PIPE) 
for line in iter(p.stdout.readline, ''): 
    print line, 

有可能是在program'側的緩衝問題,如果它打印線如果以交互方式運行,但是如果作爲子進程運行,則會緩衝其輸出。根據您的操作系統或程序有各種解決方案,例如,您可以使用pexpect module運行它。