來自Subprocess.communicate() 的流式輸出
當使用subprocess.communicate() 從進程中擷取輸出時,整個標準輸出(stdout)可能會立即返回,從而妨礙對輸出的即時監控。出現此問題的原因是communicate() 函數的阻塞性質。
為了解決這個問題,可以採用串流方法來列印每行可用的標準輸出。這可以透過使用迭代器並操作 Popen() 的 bufsize 參數來實現。
在Python 2 中:
from subprocess import Popen, PIPE p = Popen(["cmd", "arg1"], stdout=PIPE, bufsize=1) with p.stdout: for line in iter(p.stdout.readline, b''): print(line) p.wait()
在Python 3 中,程式碼變成:
from subprocess import Popen, PIPE with Popen(["cmd", "arg1"], stdout=PIPE, bufsize=1, universal_newlines=True) as p: for line in p.stdout: print(line, end='')
bufsize=1 參數強制進程在每行之後刷新其輸出緩衝區,確保立即列印每行。 iter() 允許非同步讀取行,從而可以串流輸出。進程終止是透過 wait() 方法處理的。
透過使用這種串流方法,您可以即時監視長時間運行的進程的輸出,而不會影響 communications() 函數的同步性質。
以上是如何使用 Python 即時串流子進程輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!