Maison >développement back-end >Tutoriel Python >Comment diffuser la sortie du sous-processus en temps réel à l'aide de « subprocess.communicate() » de Python ?

Comment diffuser la sortie du sous-processus en temps réel à l'aide de « subprocess.communicate() » de Python ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-01 00:30:19871parcourir

How to Stream Subprocess Output in Real-time using Python's `subprocess.communicate()`?

Streaming de la sortie de subprocess.communicate()

En Python, utiliser subprocess.communicate() pour lire la sortie standard d'un processus qui s'exécute pendant une période prolongée peut être problématique. La sortie résultante est reçue en une seule fois, ce qui gêne l'affichage en temps réel.

Pour surmonter ce problème, il est possible d'imprimer chaque ligne de la sortie standard au fur et à mesure de sa génération tout en garantissant la fin du processus avant de continuer :

Python 2

#!/usr/bin/env python2
from subprocess import Popen, PIPE

p = Popen(["cmd", "arg1"], stdout=PIPE, bufsize=1)
with p.stdout:
    for line in iter(p.stdout.readline, b''):
        print(line)
p.wait()  # Wait for subprocess termination

Python 3

#!/usr/bin/env python3
from subprocess import Popen, PIPE

with Popen(["cmd", "arg1"], stdout=PIPE, bufsize=1, universal_newlines=True) as p:
    for line in p.stdout:
        print(line, end='')

Cette approche modifiée lit en continu les lignes au fur et à mesure de leur écriture, en contournant le délai du tampon. Le processus conserve toujours son comportement de blocage, interrompant l'exécution jusqu'à la fin.

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