Redirecionamento de fluxo contextual em Python
O redirecionamento de saída padrão e fluxos de erro (stdout e stderr) é útil em muitos cenários. No entanto, os métodos convencionais geralmente ficam aquém quando uma função mantém uma referência interna a esses fluxos.
Necessidade de uma solução dinâmica
Técnicas de redirecionamento tradicionais, como sys.stdout, redirecionar fluxos permanentemente. Esse problema surge quando um método copia inerentemente uma dessas variáveis internamente. Conseqüentemente, esses métodos não redirecionam adequadamente os fluxos.
Solução: extensão do gerenciador de contexto
Para resolver esse problema de maneira eficaz, uma abordagem de gerenciador de contexto pode ser empregada. Este método envolve agrupar a lógica de redirecionamento em um gerenciador de contexto:
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
Ao utilizar este gerenciador de contexto, você pode redirecionar fluxos perfeitamente dentro do bloco de contexto:
devnull = open(os.devnull, 'w')
print('Fubar')
with RedirectStdStreams(stdout=devnull, stderr=devnull):
print("You'll never see me")
print("I'm back!")
Conclusão
A solução fornecida aproveita o padrão do gerenciador de contexto para redirecionar temporariamente stdout e stderr, contornando as limitações das abordagens anteriores . Esta técnica é particularmente útil ao lidar com funções que possuem referências locais a esses fluxos.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3