"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como redirecionar dinamicamente saída padrão e fluxos de erros em funções Python?

Como redirecionar dinamicamente saída padrão e fluxos de erros em funções Python?

Publicado em 2024-11-08
Navegar:932

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

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.

Tutorial mais recente Mais>

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