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.
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