Heim >Backend-Entwicklung >Python-Tutorial >Wie kann man stdout/stderr in Python mit einem Kontextmanager vorübergehend umleiten?

Wie kann man stdout/stderr in Python mit einem Kontextmanager vorübergehend umleiten?

Linda Hamilton
Linda HamiltonOriginal
2024-10-31 00:28:03652Durchsuche

How to Temporarily Redirect stdout/stderr in Python with a Context Manager?

Vorübergehende Umleitung von stdout/stderr, Revisited

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.

Einschränkungen aktueller Lösungen

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.

Eine ContextManager-Lösung

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.

Verwendungsbeispiel

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!

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