簡體   English   中英

Python:subprocess.popen()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM