Redirection de sortie avec sous-processus en Python : fichiers et terminal simultanément
Lors de l'utilisation de la fonction subprocess.call de Python pour exécuter plusieurs exécutables, les utilisateurs peuvent souhaiter que stdout et stderr sont écrits simultanément dans les fichiers spécifiés et dans le terminal.
Pour y parvenir, au lieu d'utiliser subprocess.call, on peut utiliser directement la fonction Popen avec l'argument stdout=PIPE. Cela permet de lire depuis p.stdout :
import sys from subprocess import Popen, PIPE def tee(infile, *files): for line in iter(infile.readline, b""): for f in files: f.write(line) def teed_call(cmd_args, stdout=None, stderr=None): p = Popen( cmd_args, stdout=PIPE if stdout is not None else None, stderr=PIPE if stderr is not None else None ) if stdout is not None: tee(p.stdout, stdout, getattr(sys.stdout, "buffer", sys.stdout)) if stderr is not None: tee(p.stderr, stderr, getattr(sys.stderr, "buffer", sys.stderr)) for t in threads: t.join() return p.wait()
Avec cette fonction modifiée, les utilisateurs peuvent spécifier des fichiers pour stdout et stderr tout en imprimant sur le terminal. Par exemple :
outf, errf = open("out.txt", "wb"), open("err.txt", "wb") assert not teed_call(["cat", __file__], stdout=None, stderr=errf) assert not teed_call(["echo", "abc"], stdout=outf, stderr=errf, bufsize=0) assert teed_call(["gcc", "a b"], close_fds=True, stdout=outf, stderr=errf)
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!