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.
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.
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>
Cette classe permet une redirection temporaire de stdout et stderr.
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>
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!