監控子進程命令的即時輸出
在Python中,subprocess.Popen允許您在控制子進程的輸入和輸出的同時執行子進程。預設情況下,Popen 將 stdout 和 stderr 捕獲到稍後可以存取的緩衝區中。然而,這對於即時監控子進程的進度來說可能是不夠的。
同時輸出儲存和即時串流
同時儲存用於日誌記錄的輸出並提供直播,可以採用多種方法:
基於檔案方法
建立一個用於日誌記錄的檔案對象,將其傳遞給Popen 的stdout參數,並開啟相同檔案以非阻塞模式進行讀取。您可以循環監視文件的內容,將它們寫入控制台和日誌檔案。這允許您增量檢索輸出。
with io.open("test.log", "wb") as writer, io.open("test.log", "rb", 1) as reader: process = subprocess.Popen(command, stdout=writer) while process.poll() is None: sys.stdout.write(reader.read()) time.sleep(0.5) # Read the remaining sys.stdout.write(reader.read())
基於迭代器的方法
從 Popen 的 stdout 建立一個迭代器,並使用它連續讀取和寫入標準輸出和日誌檔案。此方法適用於處理 stdout 和日誌檔案的位元組流。
import subprocess import sys with open("test.log", "wb") as f: process = subprocess.Popen(your_command, stdout=subprocess.PIPE) # replace "" with b"" for Python 3 for c in iter(lambda: process.stdout.read(1), ""): sys.stdout.buffer.write(c) f.buffer.write(c)
注意: 如果需要,這些方法需要明確處理二進位資料。對於 Python 3,將 open 語句中的“”替換為 b“”,將“w”替換為“wb”。
以上是如何在 Python 中即時監控和記錄子進程輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!