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
Libérer: 2024-12-10 14:09:10
original
318 Les gens l'ont consulté

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)
Copier après la connexion

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())
Copier après la connexion

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()
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal