Maison >développement back-end >Tutoriel Python >Comment puis-je obtenir un filtrage de sortie ligne par ligne non bloquant à partir de sous-processus en Python ?

Comment puis-je obtenir un filtrage de sortie ligne par ligne non bloquant à partir de sous-processus en Python ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-10 14:09:10344parcourir

How Can I Achieve Non-Blocking Line-by-Line Output Filtering from Subprocesses in Python?

Filtrage de sortie non bloquant des sous-processus : une approche ligne par ligne

Dans la programmation Python, la capacité de capturer et de traiter la sortie des commandes externes est cruciale. Un scénario courant implique l'utilisation du module de sous-processus pour exécuter une commande et récupérer sa sortie. Cependant, des défis surviennent lorsque la sortie est étendue, et nous devons la filtrer et l'afficher de manière incrémentielle.

Le problème de la sortie retardée

Considérez le script Python suivant qui appelle un utilitaire qui génère大量输出:

import time
i = 0
while True:
    print(hex(i)*512)
    i += 1
    time.sleep(0.5)

Dans notre processus parent, nous essayons de lire et de filtrer les sortie :

import subprocess
proc = subprocess.Popen(['python', 'fake_utility.py'], stdout=subprocess.PIPE)
for line in proc.stdout:
    # perform filtering logic
    print("test:", line.rstrip())

Au départ, on s'attendait à ce que la sortie de l'utilitaire soit affichée ligne par ligne au fur et à mesure qu'elle devenait disponible. Toutefois, cela ne s'est pas produit ; au lieu de cela, la sortie n'a été affichée qu'après qu'une quantité importante ait été produite.

Inefficacité des itérateurs

La raison de ce retard réside dans l'utilisation de la boucle for sur proc.stdout. Cela lit implicitement la totalité de la sortie en mémoire avant de la traiter de manière itérative. Pour résoudre ce problème, nous pouvons utiliser une méthode plus efficace : utiliser readline().

import subprocess
proc = subprocess.Popen(['python','fake_utility.py'],stdout=subprocess.PIPE)
while True:
  line = proc.stdout.readline()
  if not line:
    break
  # perform filtering logic
  print "test:", line.rstrip()

Cette approche nous permet de lire la sortie ligne par ligne au fur et à mesure qu'elle devient disponible, éliminant ainsi le délai et offrant une plus grande visibilité. processus de filtrage réactif.

Conclusion

Le filtrage de la sortie des sous-processus peut être une tâche courante en Python. En comprenant les nuances de la mise en mémoire tampon d'E/S et en employant des techniques efficaces telles que readline(), les développeurs peuvent implémenter des filtres non bloquants qui traitent et affichent les données de manière incrémentielle, améliorant ainsi la réactivité de leurs applications.

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