2013-01-21 119 views
6

我試圖讓一個腳本的輸出,它使用Python的subprocess.Popen喜歡如下Python的POPEN()。stdout.read()掛

process = Popen(command, stdout=PIPE, shell=True) 
exitcode = process.wait() 
output = process.stdout.read() # hangs here 

它掛在第三行,只有當我運行它作爲一個python腳本,我不能在python shell中重現這一點。

其他腳本只顯示幾個字,我假設它不是緩衝區問題。

有沒有人知道我在做什麼錯在這裏?

+0

如果你在'command'手動執行命令,它會產生輸出嗎? –

回答

0

您可能要使用.communicate()而不是.wait().read()。使用stdout=PIPE和/或stderr=PIPE

警告這將死鎖和子進程產生足夠的輸出到管道,使得它阻止等待操作系統管緩衝區,接受:注意有關subprocess文檔頁面上的警告wait()更多數據。使用communicate()來避免這種情況。

http://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait

+0

感謝您的回答。我剛剛意識到我已經閱讀了文檔的一部分..我正在做的是在'while process.poll()中實時獲取stdout(無):腳本運行時的循環,上面的代碼是一個剝離版本。但是,我猜這是因爲類似的死鎖問題而掛着...... – lyomi

0

read()方法返回前等待EOF。

您可以:

  • 等待子進程死亡,然後閱讀()將返回。
  • 使用readline()如果你的輸出被分解成行(如果沒有輸出行,仍然會掛起)。
  • 使用從F返回至多N個字節的os.read(F,N),但是如果管道爲空(除非在fd上設置了O_NONBLOCK),它仍會阻塞。