2009-09-18 49 views
16

我有一個程序寫入標準輸出並可能寫入stderr。我想從python運行它,捕獲stdout和stderr。我的代碼如下所示:如何才能找出爲什麼subprocess.Popen等待()如果stdout = PIPE永遠等待?

from subprocess import * 

p = Popen(exe, shell=TRUE, stdout=PIPE, stderr=PIPE) 
rtrncode = p.wait() 

的一對夫婦的程序,這工作得很好,但是當我加入一個新的,新的一個永遠掛起。如果我刪除stdout=PIPE,程序將其輸出寫入控制檯並完成,並且一切都很好。我怎樣才能確定是什麼導致了掛起?

在Windows XP上使用python 2.5。該程序不從標準輸入讀取,也不具有任何用戶輸入(即「擊中鍵」)。

回答

35

當管道緩衝區填滿(通常爲4KB左右)時,寫入過程將停止,直到讀取過程讀取了一些有問題的數據;但是在這裏你直到子過程完成纔讀取任何東西,因此造成了僵局。 The docswait說得非常清楚確實:

警告如果 子進程產生足夠的輸出 到標準輸出或標準錯誤管道,使得 它會阻止等待操作系統管 緩衝區接受這將死鎖更多數據。溝通()使用 來避免這種情況。

如果您不能使用communicate出於某種原因,有子寫入到一個臨時文件,然後你就可以wait和閱讀文件時,它已經準備好 - 寫入文件,而不是到管道,不會造成死鎖。

+0

你打敗了我。 +1 – MitMaro 2009-09-18 16:37:30

+0

使用python 2.5安裝的幫助文件沒有那麼一點點的信息。謝謝 – 2009-09-18 17:07:12

+1

@Graeme啊,是的,2.6的文檔大大改進了2.5。 – 2009-09-18 17:11:55

1

看看docs。它聲明你不應該使用等待,因爲它可能導致死鎖。嘗試使用communicate