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

Linda Hamilton
Freigeben: 2024-10-31 00:28:03
Original
584 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!