Maison >développement back-end >Tutoriel Python >Comment puis-je obtenir une sortie en direct d'une commande de sous-processus en Python ?

Comment puis-je obtenir une sortie en direct d'une commande de sous-processus en Python ?

DDD
DDDoriginal
2024-12-03 08:52:09391parcourir

How Can I Get Live Output from a Subprocess Command in Python?

Sortie en direct d'une commande de sous-processus

En Python, vous pouvez capturer la sortie d'une commande de sous-processus et produire simultanément une sortie de diffusion en direct à l'aide les approches suivantes :

Utiliser un Itérateur

import subprocess
import sys

p = subprocess.Popen(['command'], stdout=subprocess.PIPE)
for line in iter(lambda: p.stdout.readline(1), ''):
    sys.stdout.buffer.write(line)

Utilisation d'un FileWriter et d'un FileReader

import io
import time
import subprocess
import sys

log = 'test.log'
with io.open(log, 'wb') as writer, io.open(log, 'rb', 1) as reader:
    p = subprocess.Popen(['command'], stdout=writer)
    while p.poll() is None:
        sys.stdout.write(reader.read())
        time.sleep(0.5)
    # Read the remaining
    sys.stdout.write(reader.read())

Refactoring du code original

Dans votre code original, vous pouvez capturer la sortie en direct après avoir créé un sous-processus comme suit :

ret_val = subprocess.Popen(run_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True )
while not ret_val.poll():
    log_file.flush()
    for line in iter(lambda: ret_val.stdout.readline(1), ''):
        if line:
            print(line)
            log_file.write(line.decode())

Cette méthode vous permet de capturer à la fois les flux stdout et stderr et d'imprimer la sortie en direct tout en l'écrivant simultanément dans un fichier journal.

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