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!