Maison  >  Article  >  développement back-end  >  Comment puis-je rediriger simultanément stdout et stderr d'un sous-processus vers les fichiers et le terminal en Python ?

Comment puis-je rediriger simultanément stdout et stderr d'un sous-processus vers les fichiers et le terminal en Python ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-04 04:13:01428parcourir

How can I redirect both stdout and stderr from a subprocess to files and the terminal simultaneously in Python?

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!

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