Maison >développement back-end >Tutoriel Python >Comment rediriger temporairement stdout et stderr dans les méthodes Python ?

Comment rediriger temporairement stdout et stderr dans les méthodes Python ?

DDD
DDDoriginal
2024-10-28 12:09:01548parcourir

How to Temporarily Redirect stdout and stderr in Python Methods?

Redirection temporaire de stdout et stderr

Est-il possible de rediriger temporairement stdout et stderr, spécifiquement pour la durée d'une méthode en Python ?

Le piège des solutions existantes :

Les solutions CurrentUserSolutions, malheureusement, ne redirigent pas véritablement les flux ; au lieu de cela, ils les remplacent simplement entièrement. Cependant, cette approche échoue si une méthode possède une copie locale de l'un ou l'autre flux (par exemple, en raison de son utilisation comme paramètre).

Solution basée sur le gestionnaire de contexte :

Encapsuler la logique de redirection dans un gestionnaire de contexte résout ce problème. Voici un exemple :

<code class="python">import os
import sys

class RedirectStdStreams:
    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>

Lorsqu'il est utilisé comme indiqué dans l'exemple, ce gestionnaire de contexte redirige temporairement stdout et stderr vers /dev/null, garantissant que toute sortie de la ligne "Vous ne me verrez jamais" est effectivement masqué pendant que la redirection est active.

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