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?
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!