Heim >Backend-Entwicklung >Python-Tutorial >Wie kann man stdout und stderr in Python-Methoden vorübergehend umleiten?

Wie kann man stdout und stderr in Python-Methoden vorübergehend umleiten?

DDD
DDDOriginal
2024-10-28 12:09:01543Durchsuche

How to Temporarily Redirect stdout and stderr in Python Methods?

Stdout und stderr 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!

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