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