Heim >Backend-Entwicklung >Python-Tutorial >Wie dupliziere ich Pythons sys.stdout in eine Protokolldatei, einschließlich der Systemaufrufausgabe?
sys.stdout in eine Protokolldatei duplizieren
In diesem Programmierrätsel besteht das Ziel darin, alle Ausgaben einer Python-Anwendung zu duplizieren, einschließlich Systemaufrufausgabe in eine separate Protokolldatei. Allerdings hat sich diese Aufgabe für den Benutzer als eine Herausforderung erwiesen.
Anfangs versuchte der Benutzer eine Lösung, indem er die Reihenfolge der dup2-Aufrufe umkehrte, aber ohne Erfolg. Der folgende Code demonstriert ihren erfolglosen Versuch:
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)
Bei diesem Ansatz hätte die Datei „a.log“ dieselbe Ausgabe enthalten sollen, die auf dem Bildschirm angezeigt wurde, was jedoch nicht der Fall war.
Lösung
Glücklicherweise gibt es eine Lösung für dieses Problem. Der folgende Code stellt eine Klasse namens Tee bereit, die sys.stdout erfolgreich in eine angegebene Protokolldatei dupliziert:
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()
Diese Klasse ermöglicht es dem Benutzer, eine Tee-Instanz zu erstellen und den Namen und Modus der Protokolldatei anzugeben. Anschließend wird sys.stdout zur Tee-Instanz umgeleitet, wodurch die gesamte Ausgabe effektiv in die Protokolldatei dupliziert wird, während die Ausgabe auf dem Bildschirm weiterhin erhalten bleibt.
Das obige ist der detaillierte Inhalt vonWie dupliziere ich Pythons sys.stdout in eine Protokolldatei, einschließlich der Systemaufrufausgabe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!