Sortie en temps réel des sous-processus
En Python, le module de sous-processus fournit un moyen pratique d'exécuter des programmes externes. Cependant, par défaut, il capture toutes les sorties du programme et les renvoie une fois le processus terminé. Cela peut être problématique pour les processus de longue durée.
Présentation de l'interrogation de sortie itérative
Pour résoudre ce problème, vous pouvez exploiter la fonction iter() pour récupérer la sortie ligne par ligne. comme la commande le génère. Voici une version modifiée de votre fonction execute() qui implémente cette approche :
<code class="python">def execute(cmd): popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True) for stdout_line in iter(popen.stdout.readline, ""): yield stdout_line popen.stdout.close() return_code = popen.wait() if return_code: raise subprocess.CalledProcessError(return_code, cmd)</code>
Exemple d'utilisation
Vous pouvez maintenant parcourir la sortie du processus au fur et à mesure devient disponible :
<code class="python">for path in execute(["locate", "a"]): print(path, end="")</code>
Cet exemple imprimera en continu le résultat de la commande de localisation lors de la recherche de fichiers.
Intervalle d'interrogation
Bien que cette méthode fournisse une sortie en temps réel, l'intervalle d'interrogation peut avoir un impact sur les performances. Le paramètre universal_newlines garantit que vous obtenez des lignes de texte plutôt que des octets, ce qui entraîne une surcharge supplémentaire. Pour optimiser l'interrogation, vous pouvez réduire la fréquence à laquelle la sortie du processus est vérifiée.
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!