Kontextuelle Stream-Umleitung in Python
Die Umleitung von Standardausgabe- und Fehlerströmen (stdout und stderr) erweist sich in vielen Szenarien als nützlich. Herkömmliche Methoden versagen jedoch oft, wenn eine Funktion einen internen Verweis auf diese Streams enthält.
Bedarf an einer dynamischen Lösung
Traditionelle Umleitungstechniken wie sys.stdout, Streams dauerhaft umleiten. Dieses Problem tritt auf, wenn eine Methode eine dieser Variablen intern kopiert. Folglich können diese Methoden die Streams nicht ordnungsgemäß umleiten.
Lösung: Kontext-Manager-Erweiterung
Um dieses Problem effektiv zu lösen, kann ein Kontext-Manager-Ansatz eingesetzt werden. Bei dieser Methode wird die Umleitungslogik in einen Kontextmanager eingeschlossen:
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
Durch die Verwendung dieses Kontextmanagers können Sie Streams innerhalb des Kontextblocks nahtlos umleiten:
devnull = open(os.devnull, 'w')
print('Fubar')
with RedirectStdStreams(stdout=devnull, stderr=devnull):
print("You'll never see me")
print("I'm back!")
Fazit
Die bereitgestellte Lösung nutzt das Kontextmanagermuster, um stdout und stderr vorübergehend umzuleiten und so die Einschränkungen früherer Ansätze zu umgehen . Diese Technik erweist sich als besonders nützlich, wenn es um Funktionen geht, die lokale Verweise auf diese Streams besitzen.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3