Heim >Backend-Entwicklung >Python-Tutorial >Wie dupliziere ich Pythons sys.stdout in eine Protokolldatei, einschließlich der Systemaufrufausgabe?

Wie dupliziere ich Pythons sys.stdout in eine Protokolldatei, einschließlich der Systemaufrufausgabe?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-27 06:04:14377Durchsuche

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

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn