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!