Heim >Backend-Entwicklung >Python-Tutorial >Wie kann ich Pythons sys.stdout sowohl im interaktiven als auch im Daemon-Modus in eine Protokolldatei duplizieren?
Duplizieren von sys.stdout in eine Protokolldatei
Durch das Duplizieren von sys.stdout in eine Protokolldatei können Sie alle Ausgaben, einschließlich Systemaufrufe, erfassen , aus einer Python-Anwendung. Trotz ihrer Einfachheit stellt diese Aufgabe eine einzigartige Herausforderung dar, wenn die Anwendung sowohl im interaktiven als auch im Daemon-Modus arbeitet.
Interaktiv vs. Daemon-Modus
Im interaktiven Modus, wie Sie möchten sowohl den Bildschirm als auch eine Protokolldatei, um die Ausgabe zu erhalten. Im Daemon-Modus sollten jedoch alle Ausgaben in die Protokolldatei geleitet werden. Die Funktion os.dup2() eignet sich gut zum Umleiten der Ausgabe im Daemon-Modus, bietet jedoch keine einfache Lösung zum Duplizieren der Ausgabe im interaktiven Modus, ohne Systemaufrufe zu ändern.
Duplikation mit Tee
Um dieses Problem zu lösen, können Sie die Tee-Klasse verwenden, die eine Möglichkeit bietet, stdout in eine Protokolldatei zu duplizieren. Hier ist ein Beispiel:
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()
Mit dieser Klasse können Sie eine Tee-Instanz erstellen, die einen Protokolldateinamen und einen Modus als Parameter verwendet. Die write()-Methode dupliziert die Ausgabe sowohl in die Protokolldatei als auch in die Standardausgabe.
Implementierungsbeispiel
So verwenden Sie die Tee-Klasse:
with Tee('logfile.txt', 'w') as tee: print('Hello world!') os.system('ls -la')
In diesem Beispiel werden alle Ausgaben, einschließlich des Systemaufrufs von „ls -la“, sowohl auf den Bildschirm als auch in die Protokolldatei geschrieben 'logfile.txt'.
Diese Lösung protokolliert effektiv alle Ausgaben, einschließlich der Systemaufrufausgabe, ohne dass einzelne Systemaufrufe geändert werden müssen.
Das obige ist der detaillierte Inhalt vonWie kann ich Pythons sys.stdout sowohl im interaktiven als auch im Daemon-Modus in eine Protokolldatei duplizieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!