Heim  >  Artikel  >  Backend-Entwicklung  >  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
Barbara StreisandOriginal
2024-10-27 00:12:30235Durchsuche

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>

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!

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