Maison  >  Article  >  développement back-end  >  Comment rediriger temporairement stdout/stderr dans les méthodes Python sans affecter les copies de flux locaux ?

Comment rediriger temporairement stdout/stderr dans les méthodes Python sans affecter les copies de flux locaux ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-27 00:12:30235parcourir

How to Temporarily Redirect stdout/stderr in Python Methods Without Affecting Local Stream Copies?

Redirection temporaire de stdout/stderr dans une méthode : solutions actuelles imparfaites

Le problème avec les solutions existantes pour rediriger temporairement stdout/stderr en Python réside dans leur incapacité à se réorienter ; au lieu de cela, ils remplacent entièrement les flux. Cela devient problématique lorsque les méthodes possèdent des copies locales des flux (par exemple, passées en paramètres), rendant la redirection inefficace.

Solution via Contextmanager

Une approche alternative consiste à utiliser un contextmanager pour encapsuler la logique de redirection. Cette approche garantit que la redirection n'est active que dans le contexte, sans affecter les copies de flux locales :

<code class="python">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

if __name__ == '__main__':

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

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

    print("I'm back!")</code>

Dans cet exemple, la classe RedirectStdStreams est conçue pour rediriger à la fois stdout et stderr vers une destination spécifiée (par exemple, /dev/null) dans un contexte défini. Cette approche redirige efficacement les flux sans interrompre les copies de flux locaux.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn