Maison  >  Article  >  développement back-end  >  Comment puis-je écrire simultanément la sortie du sous-processus sur le terminal et les fichiers en Python ?

Comment puis-je écrire simultanément la sortie du sous-processus sur le terminal et les fichiers en Python ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-03 22:58:30740parcourir

How Can I Write Subprocess Output to Both the Terminal and Files Simultaneously in Python?

Écriture de la sortie du processus vers le terminal et les fichiers simultanément avec le sous-processus de Python

Lors de l'exécution de plusieurs exécutables à l'aide de subprocess.call(), il est souhaitable d'avoir sortie affichée à la fois dans le terminal et dans un fichier désigné. Cependant, le comportement par défaut autorise uniquement la redirection de sortie vers un fichier ou un terminal.

Pour surmonter cette limitation, envisagez d'utiliser Popen directement en conjonction avec l'argument stdout=PIPE. Cela vous permettra de lire la sortie de l'attribut stdout de l'objet Popen.

Pour obtenir le comportement souhaité, suivez les étapes suivantes :

  • Créez un tee() function : Cette fonction génère un thread pour transférer les entrées d'un fichier vers plusieurs fichiers de sortie.
  • Implémentez une fonction teed_call() : Cette fonction émule subprocess.call() mais accepte arguments supplémentaires pour les fichiers stdout et stderr. Il utilise tee() pour écrire la sortie dans les fichiers et dans le terminal.

Voici un exemple d'utilisation de ces fonctions :

<code class="python">import sys
from subprocess import Popen, PIPE
from threading import Thread

def tee(infile, *files):
    ...

def teed_call(cmd_args, **kwargs):
    ...

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)</code>

Ce code écrit efficacement la sortie dans les deux les fichiers et le terminal simultanément pour chaque commande exécutée.

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