"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo redirigir dinámicamente flujos de error y salida estándar en funciones de Python?

¿Cómo redirigir dinámicamente flujos de error y salida estándar en funciones de Python?

Publicado el 2024-11-08
Navegar:818

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

Redirección de flujo contextual en Python

La redirección de flujos de error y salida estándar (stdout y stderr) resulta útil en muchos escenarios. Sin embargo, los métodos convencionales a menudo se quedan cortos cuando una función contiene una referencia interna a estos flujos.

Necesidad de una solución dinámica

Técnicas de redirección tradicionales, como sys.stdout, redirigir transmisiones permanentemente. Este problema surge cuando un método copia inherentemente una de estas variables internamente. En consecuencia, estos métodos no logran redirigir adecuadamente las transmisiones.

Solución: Extensión del administrador de contexto

Para abordar eficazmente este problema, se puede emplear un enfoque de administrador de contexto. Este método implica envolver la lógica de redirección dentro de un administrador 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

Al utilizar este administrador de contexto, puede redirigir secuencias sin problemas dentro del bloque 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!")

Conclusión

La solución proporcionada aprovecha el patrón del administrador de contexto para redirigir temporalmente stdout y stderr, evitando las limitaciones de enfoques anteriores . Esta técnica resulta particularmente útil cuando se trata de funciones que poseen referencias locales a estos flujos.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3