Diffusion en continu de la sortie du sous-processus ligne par ligne
Lorsque vous traitez des utilitaires Linux bruyants invoqués via un sous-processus en Python, capturez efficacement la sortie dans un fichier journal et l'afficher à l'utilisateur peut être difficile.
Le Problème :
Initialement, un script Python a tenté de capturer la sortie du sous-processus à l'aide du code suivant :
for line in proc.stdout: # Filter output here print("test:", line.rstrip())
Cependant, cette approche n'a pas présenté le comportement souhaité de la ligne de sortie de streaming en doubler. Au lieu de cela, la sortie n'est apparue qu'après qu'une quantité importante ait été générée.
La solution :
Le problème réside dans l'utilisation de l'itérateur pour la ligne dans proc.stdout, qui lit l'intégralité de la sortie à l'avance. Pour résoudre ce problème, readline() doit être utilisé à la place :
# Filter output import subprocess proc = subprocess.Popen(['python', 'fake_utility.py'], stdout=subprocess.PIPE) while True: line = proc.stdout.readline() if not line: break # Filter output here print("test:", line.rstrip())
Avec cette modification, la sortie est désormais diffusée ligne par ligne comme vous le souhaitez.
Considérations relatives à la mise en mémoire tampon :
Il est important de noter que le sous-processus peut toujours mettre la sortie en mémoire tampon. Pour gérer cela, la méthode de vidage ou d'autres techniques peuvent être nécessaires pour garantir un affichage rapide de la sortie.
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!