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

Mary-Kate Olsen
Libérer: 2024-11-04 04:13:01
original
483 Les gens l'ont consulté

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()
Copier après la connexion

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

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