2011-04-04 33 views
1

我有一個關於subprocess.popen()一個問題:的Python:subprocess.popen()

如果理應執行的命令是在一個while循環 - 有沒有辦法爲subprocess.popen()打印第一輸出後,檢測並退出?

或者還有其他方式來做到這一點,並打印結果?

正如你看到上執行的Linux機器只是不斷執行以下程序:

>>> import os 
    >>> import subprocess as sp 
    >>> p = sp.Popen("yes", stdout=sp.PIPE) 
    >>> result = p.communicate()[0] 

回答

4

的溝通如果被調用的程序有望以相對較少的輸出很快終止方法纔是有用的。就你的例子而言,「yes」程序永遠不會終止,所以通訊從不完成。爲了處理無限期執行的子進程,並且可能產生大量輸出,您需要包含一個重複調用p.poll()直到p.poll()返回非None值的循環,這將表明該過程已終止。在此循環中,您應該從p.stdout和p.stderr讀取消耗程序的任何輸出。如果不使用輸出,則緩衝區可能會填滿並導致程序阻止等待寫入更多輸出。

import subprocess 
import time 

p = subprocess.Popen("yes", stdout=subprocess.PIPE) 
result = "" 

start_time = time.time() 

while (p.poll() is None): 
    result += p.stdout.read(8192) 
    time.sleep(1) 
    if (time.time() - start_time) > 5: 
    print "Timeout" 
    break 

print result 

請注意,上述示例將無限期地運行,直到您終止正在讀取輸入的「是」子進程。如果你想檢測到進程沒有終止,你可以在while循環中添加一個時間檢查,並在足夠的時間過後在某個點跳出。如果你確定你的子進程會自動終止,你可以簡單地調用communications()並取回輸出,但是這在你的例子中不起作用,因爲我上面解釋的原因。

+0

如何根據您的指示添加時間檢查 – Rajeev 2011-04-04 15:20:30

+0

我已更新代碼以包含時間檢查,該時間檢查在5秒後跳出循環。如何改變超時間隔應該是顯而易見的。 – 2011-04-04 16:32:24

相關問題