Heim > Backend-Entwicklung > Python-Tutorial > Wie kann man stdout/stderr in Python-Methoden vorübergehend umleiten, ohne die lokalen Stream-Kopien zu beeinträchtigen?

Wie kann man stdout/stderr in Python-Methoden vorübergehend umleiten, ohne die lokalen Stream-Kopien zu beeinträchtigen?

Barbara Streisand
Freigeben: 2024-10-27 00:12:30
Original
339 Leute haben es durchsucht

How to Temporarily Redirect stdout/stderr in Python Methods Without Affecting Local Stream Copies?

Vorübergehendes Umleiten von stdout/stderr in einer Methode: Unvollkommene aktuelle Lösungen

Das Problem mit vorhandenen Lösungen zum vorübergehenden Umleiten von stdout/stderr in Python liegt in ihrer Unfähigkeit, umzuleiten; Stattdessen ersetzen sie Streams vollständig. Dies wird problematisch, wenn Methoden über lokale Kopien von Streams verfügen (z. B. als Parameter übergeben), wodurch die Umleitung unwirksam wird.

Lösung über Contextmanager

Ein alternativer Ansatz besteht in der Verwendung von a contextmanager, um die Umleitungslogik zu kapseln. Dieser Ansatz stellt sicher, dass die Umleitung nur innerhalb des Kontexts aktiv ist, ohne Auswirkungen auf lokale Stream-Kopien:

<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

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 ist die RedirectStdStreams-Klasse so konzipiert, dass sowohl stdout als auch stderr an ein angegebenes Ziel umgeleitet werden (z. B. /dev/null) innerhalb eines definierten Kontexts. Dieser Ansatz leitet Streams effektiv um, ohne lokale Stream-Kopien zu unterbrechen.

Das obige ist der detaillierte Inhalt vonWie kann man stdout/stderr in Python-Methoden vorübergehend umleiten, ohne die lokalen Stream-Kopien zu beeinträchtigen?. 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