Heim >Backend-Entwicklung >Python-Tutorial >Wie kann ich die Ausgabe einer Python-Anwendung (einschließlich Systemaufrufen) sowohl in die Konsole als auch in eine Protokolldatei duplizieren?

Wie kann ich die Ausgabe einer Python-Anwendung (einschließlich Systemaufrufen) sowohl in die Konsole als auch in eine Protokolldatei duplizieren?

Susan Sarandon
Susan SarandonOriginal
2024-11-29 08:24:14242Durchsuche

How Can I Duplicate Python Application Output (Including System Calls) to Both the Console and a Log File?

Umleiten und Duplizieren der Ausgabe in eine Protokolldatei

Sie streben danach, die Funktionalität des Befehlszeilen-Dienstprogramms „tee“ zu erreichen, wo alle Ausgaben erfolgen Die von Ihrer Python-Anwendung generierten Daten, einschließlich der Systemaufrufausgabe, werden in einem Protokoll dupliziert Datei.

Umleitung

Ihr erster Ansatz bestand darin, die Dateideskriptoren von sys.stdout und sys.stderr in die Protokolldatei zu duplizieren, wodurch die Ausgabe erfolgreich an die Anmeldung umgeleitet wird Daemon-Modus. Allerdings ist diese Methode im interaktiven Modus unzureichend, da sie die gleichzeitige Anzeige der Ausgabe auf dem Bildschirm behindert.

Duplizierung

Um eine Duplizierung zu erreichen, reicht es aus, die dup2-Aufrufe einfach umzukehren nicht ausreichend. Stattdessen können Sie eine Technik anwenden, die sys.stdout abfängt und die geschriebenen Daten sowohl auf dem Bildschirm als auch in der Protokolldatei dupliziert.

Lösung

Das folgende Snippet bietet eine elegante Lösung:

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 kapselt die Duplizierung von Dateideskriptoren und bietet eine nahtlose Möglichkeit, in beide zu schreiben sys.stdout und die Protokolldatei. Sie können eine Instanz von Tee initialisieren und die Protokolldateidetails als Argumente übergeben. Die Instanz wird dann zur neuen sys.stdout.

Fazit

Mit dieser Methode können Sie sowohl eine Umleitung (im Daemon-Modus) als auch eine Duplizierung (im interaktiven Modus) erreichen ) aller Anwendungsausgaben, einschließlich Systemaufrufausgaben, in eine Protokolldatei.

Das obige ist der detaillierte Inhalt vonWie kann ich die Ausgabe einer Python-Anwendung (einschließlich Systemaufrufen) sowohl in die Konsole als auch in eine Protokolldatei duplizieren?. 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