[英]Python: subprocess.popen()
我有一個關於subprocess.popen()
的問題:
如果假設執行的命令是在while循環中 - 是否有任何方法讓subprocess.popen()
檢測它並在打印第一個輸出后退出?
或者有沒有其他方法來打印結果?
如您所見,在Linux機器上執行的以下程序只是繼續執行:
>>> import os
>>> import subprocess as sp
>>> p = sp.Popen("yes", stdout=sp.PIPE)
>>> result = p.communicate()[0]
只有當被調用的程序預計很快以較少的輸出終止時,通信方法才有用。 在您的示例中,“是”程序永遠不會終止,因此通信永遠不會完成。 為了處理無限期執行的子進程,並且可能產生大量輸出,你需要包含一個重復調用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循環添加時間檢查,並在經過足夠的時間后跳出某個時間點。
如果您確定您的子進程將自行終止,您可以簡單地調用communic()並返回輸出,但由於我在上面解釋的原因,這在您的示例中不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.