首頁  >  文章  >  後端開發  >  如何將 Python 的 sys.stdout 複製到日誌文件,包括系統呼叫輸出?

如何將 Python 的 sys.stdout 複製到日誌文件,包括系統呼叫輸出?

Patricia Arquette
Patricia Arquette原創
2024-11-27 06:04:14354瀏覽

How to Duplicate Python's sys.stdout to a Log File, Including System Call Output?

將sys.stdout 複製到日誌檔案

在這個程式設計難題中,目標是複製Python 應用程式的所有輸出,包括系統呼叫輸出到單獨的日誌檔案。然而,事實證明此任務對使用者來說具有挑戰性。

最初,使用者嘗試透過顛倒 dup2 呼叫順序來解決問題,但無濟於事。下面的程式碼示範了他們不成功的嘗試:

import os, sys

so = se = open("a.log", 'w', 0)
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

os.dup2(sys.stdout.fileno(), so.fileno())
os.dup2(sys.stderr.fileno(), se.fileno())

print("foo bar")

os.spawnve("P_WAIT", "/bin/ls", ["/bin/ls"], {})
os.execve("/bin/ls", ["/bin/ls"], os.environ)

透過這種方法,檔案「a.log」應該包含與螢幕上顯示的相同的輸出,但事實並非如此。

幸運的是,這個問題有一個解決方案。下面的程式碼提供了一個名為Tee 的類,它成功地將sys.stdout 複製到指定的日誌檔案:

class Tee(object):
    def __init__(self, name, mode):
        self.file = open(name, mode)
        self.stdout = sys.stdout
        sys.stdout = self
    def __del__(self):
        sys.stdout = self.stdout
        self.file.close()
    def write(self, data):
        self.file.write(data)
        self.stdout.write(data)
    def flush(self):
        self.file.flush()

該類別允許使用者建立Tee 實例並指定日誌檔案的名稱和模式。隨後,sys.stdout 被重新導向到 Tee 實例,有效地將所有輸出複製到日誌文件,同時仍保留螢幕上的輸出。

以上是如何將 Python 的 sys.stdout 複製到日誌文件,包括系統呼叫輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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