Streaming de la sortie de Subprocess.communicate()
Lors de l'utilisation de subprocess.communicate() pour récupérer la sortie d'un processus, l'intégralité du la sortie standard (stdout) peut être renvoyée immédiatement, empêchant la surveillance en temps réel de la sortie. Ce problème survient en raison de la nature bloquante de la fonction communicate().
Pour résoudre ce problème, on peut adopter une approche de streaming pour imprimer chaque ligne de la sortie standard dès qu'elle devient disponible. Ceci peut être réalisé en employant des itérateurs et en manipulant le paramètre bufsize de Popen().
Dans Python 2 :
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()
Dans Python 3, le code devient :
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='')
Le paramètre bufsize=1 force le processus à vider son tampon de sortie après chaque ligne, garantissant que chaque ligne est imprimée immédiatement. iter() permet de lire les lignes de manière asynchrone, ce qui permet de diffuser la sortie. La fin du processus est gérée avec la méthode wait().
En utilisant cette approche de streaming, vous pouvez surveiller la sortie d'un processus de longue durée en temps réel sans compromettre la nature synchrone de la fonction communicate().
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!