"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment rediriger dynamiquement les flux de sortie standard et d'erreurs dans les fonctions Python ?

Comment rediriger dynamiquement les flux de sortie standard et d'erreurs dans les fonctions Python ?

Publié le 2024-11-08
Parcourir:951

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

Redirection de flux contextuel en Python

La redirection des flux de sortie standard et d'erreurs (stdout et stderr) s'avère utile dans de nombreux scénarios. Cependant, les méthodes conventionnelles échouent souvent lorsqu'une fonction contient une référence interne à ces flux.

Besoin d'une solution dynamique

Les techniques de redirection traditionnelles, comme sys.stdout, rediriger les flux de manière permanente. Ce problème survient lorsqu’une méthode copie intrinsèquement l’une de ces variables en interne. Par conséquent, ces méthodes ne parviennent pas à rediriger correctement les flux.

Solution : Extension du gestionnaire de contexte

Pour résoudre efficacement ce problème, une approche de gestionnaire de contexte peut être utilisée. Cette méthode implique d'encapsuler la logique de redirection dans un gestionnaire de contexte :

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

En utilisant ce gestionnaire de contexte, vous pouvez rediriger de manière transparente les flux dans le bloc de contexte :

devnull = open(os.devnull, 'w')

print('Fubar')

with RedirectStdStreams(stdout=devnull, stderr=devnull):
    print("You'll never see me")

print("I'm back!")

Conclusion

La solution fournie exploite le modèle de gestionnaire de contexte pour rediriger temporairement stdout et stderr, contournant les limitations des approches précédentes . Cette technique s'avère particulièrement utile lorsqu'il s'agit de fonctions possédant des références locales à ces flux.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3