Maison > Article > développement back-end > Comment obtenir une sortie en temps réel d'un sous-processus en Python ?
Sortie en temps réel avec sous-processus
En essayant de créer un script wrapper avec un indicateur de progression, vous avez rencontré un problème où la sortie du script encapsulé le programme a été mis en mémoire tampon malgré l'utilisation de subprocess.Popen avec stdout=PIPE. Comme vous l'avez découvert, ni la définition de bufsize sur 1 ou 0 ni l'utilisation d'une boucle de sortie n'ont résolu le problème.
Solution : utiliser readline
Par hasard, nous sommes tombés sur une solution de contournement : en utilisant la méthode readline du tube stdout. Contrairement à la méthode de boucle for que vous avez initialement utilisée, qui met en mémoire tampon de manière agressive, la boucle while True améliorée avec readline présente le comportement souhaité.
<br>while True:<br> line = p.stdout. readline()<br> if not line: break<br> ...<br>
Problème sous-jacent
Ce problème provient d'un bug connu dans Python, identifié comme numéro 3907. La cause spécifique de la mise en mémoire tampon anormale n'est pas bien comprise.
Conclusion
En tirant parti de la méthode readline, vous pouvez obtenir sortie en temps réel des programmes lancés via un sous-processus sans recourir à des techniques obsolètes ou potentiellement non sécurisées comme exec*. Cette solution de contournement reste efficace dans les versions Python au-delà de 3.x, garantissant une compatibilité ascendante.
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!