Comment rediriger temporairement stdout/stderr en Python avec un gestionnaire de contexte ?

Linda Hamilton
Libérer: 2024-10-31 00:28:03
original
650 Les gens l'ont consulté

How to Temporarily Redirect stdout/stderr in Python with a Context Manager?

Redirection temporaire de stdout/stderr, revisitée

Bien qu'il soit courant de rediriger stdout/stderr vers des fichiers externes, il peut être nécessaire de le faire temporairement, dans le cadre d'une méthode spécifique.

Limitations des solutions actuelles

Les solutions existantes remplacent généralement l'intégralité des flux de sortie, laissant les copies locales de ces flux inchangées. Cela peut entraîner des problèmes lorsque les méthodes utilisent des copies locales des flux.

Une solution ContextManager

Pour résoudre cette limitation, nous pouvons implémenter la logique de redirection à l'aide d'un gestionnaire de contexte :

<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</code>
Copier après la connexion

Cette classe permet une redirection temporaire de stdout et stderr.

Exemple d'utilisation

Pour démontrer l'utilisation, nous pouvons rediriger la sortie vers /dev/null et observer le comportement :

<code class="python">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>
Copier après la connexion

Dans cet exemple, le message "Vous ne me verrez jamais" est supprimé pendant que la redirection est active, mais est visible par la suite, confirmant que la redirection est temporaire et n'affecte que la portée au sein du gestionnaire de contexte.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal