Maison >développement back-end >Tutoriel Python >Comment diffuser la sortie du sous-processus ligne par ligne en Python ?

Comment diffuser la sortie du sous-processus ligne par ligne en Python ?

DDD
DDDoriginal
2024-12-13 19:47:18717parcourir

How to Stream Subprocess Output Line by Line in Python?

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!

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