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.
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.
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.
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!