Heim >Backend-Entwicklung >Python-Tutorial >Wie kann man stdout und stderr in Python-Methoden vorübergehend umleiten?
Ist es möglich, stdout und stderr vorübergehend umzuleiten, insbesondere für die Dauer einer Methode in Python?
Die Gefahr bestehender Lösungen:
CurrentUserSolutions leiten die Streams leider nicht wirklich um; Stattdessen ersetzen sie sie einfach vollständig. Dieser Ansatz schlägt jedoch fehl, wenn eine Methode eine lokale Kopie eines der beiden Streams besitzt (z. B. aufgrund ihrer Verwendung als Parameter).
Kontextmanager-basierte Lösung:
Die Kapselung der Umleitungslogik in einem Kontextmanager behebt dieses Problem. Hier ist ein Beispiel:
<code class="python">import os import sys class RedirectStdStreams: def __init__(self, stdout=None, stderr=None): self._stdout = stdout or sys.stdout self._stderr = stderr or sys.stderr def __enter__(self): self.old_stdout, self.old_stderr = sys.stdout, sys.stderr self.old_stdout.flush(); self.old_stderr.flush() sys.stdout, sys.stderr = self._stdout, self._stderr def __exit__(self, exc_type, exc_value, traceback): self._stdout.flush(); self._stderr.flush() sys.stdout = self.old_stdout sys.stderr = self.old_stderr if __name__ == '__main__': devnull = open(os.devnull, 'w') print('Fubar') with RedirectStdStreams(stdout=devnull, stderr=devnull): print("You'll never see me") print("I'm back!")</code>
Bei Verwendung wie im Beispiel gezeigt leitet dieser Kontextmanager stdout und stderr vorübergehend nach /dev/null um und stellt so sicher, dass alle Ausgaben aus der Zeile „You'll never see me“ erfolgen wird effektiv ausgeblendet, solange die Weiterleitung aktiv ist.
Das obige ist der detaillierte Inhalt vonWie kann man stdout und stderr in Python-Methoden vorübergehend umleiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!