首頁 >後端開發 >Python教學 >如何在 Python 中即時監控和記錄子進程輸出?

如何在 Python 中即時監控和記錄子進程輸出?

Patricia Arquette
Patricia Arquette原創
2024-12-05 04:17:10620瀏覽

How Can I Monitor and Log Subprocess Output in Real-Time in Python?

監控子進程命令的即時輸出

在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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn