Maison >développement back-end >Tutoriel Python >Comment rediriger temporairement stdout/stderr dans les méthodes Python sans affecter les copies de flux locaux ?
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!