„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie leite ich Standardausgabe- und Fehlerströme in Python-Funktionen dynamisch um?

Wie leite ich Standardausgabe- und Fehlerströme in Python-Funktionen dynamisch um?

Veröffentlicht am 08.11.2024
Durchsuche:931

How to Dynamically Redirect Standard Output and Error Streams in Python Functions?

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.

Neuestes Tutorial Mehr>

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