Während es gängige Praxis ist, stdout/stderr auf externe Dateien umzuleiten, kann es notwendig sein, dies vorübergehend und im Rahmen des Geltungsbereichs zu tun einer bestimmten Methode.
Bestehende Lösungen ersetzen normalerweise die gesamten Ausgabestreams, sodass lokale Kopien dieser Streams davon nicht betroffen sind. Dies kann zu Problemen führen, wenn Methoden lokale Kopien der Streams verwenden.
Um diese Einschränkung zu beheben, können wir die Umleitungslogik mithilfe eines Kontextmanagers implementieren:
<code class="python">import os import sys class RedirectStdStreams(object): 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</code>
Diese Klasse ermöglicht die vorübergehende Umleitung von stdout und stderr.
Um die Verwendung zu demonstrieren, können wir die Ausgabe nach /dev/null umleiten und das Verhalten beobachten:
<code class="python">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>
In diesem Beispiel wird die Meldung „Du wirst mich nie sehen“ unterdrückt, während die Umleitung aktiv ist, ist aber danach sichtbar, was bestätigt, dass die Umleitung vorübergehend ist und nur den Bereich innerhalb des Kontextmanagers betrifft.
Das obige ist der detaillierte Inhalt vonWie kann man stdout/stderr in Python mit einem Kontextmanager vorübergehend umleiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!