Maison >développement back-end >Tutoriel Python >Comment empêcher Python de se bloquer lors de la lecture de la sortie d'un processus constamment mis à jour ?
Lorsque vous essayez de lire la sortie d'un processus constamment mis à jour en Python, vous pouvez rencontrer des problèmes de blocage. Ce problème survient spécifiquement lors de l'utilisation de la méthode readlines().
Dans l'extrait de code fourni, le process = os.popen("top"). La ligne readlines() provoque le blocage du programme. En effet, readlines() lit l'intégralité de la sortie du sous-processus en une seule fois, ce qui peut être important et entraîner une longue opération de blocage.
Une meilleure approche est pour utiliser la fonction subprocess.Popen() pour créer un sous-processus et gérer ses entrées et sorties. Voici comment procéder :
<code class="python">import subprocess process = subprocess.Popen('top') time.sleep(2) os.popen("killall top") print process</code>
Ce code utilise Popen() pour créer un sous-processus en cours d'exécution. Après avoir attendu 2 secondes, il termine le processus principal et imprime enfin l'objet du sous-processus. Cependant, cette approche renvoie toujours un objet non formaté.
Pour lire la sortie du sous-processus sans bloquer le programme, vous pouvez utiliser un fichier temporaire pour stocker la sortie. Voici une version améliorée du code :
<code class="python">#!/usr/bin/env python import subprocess import tempfile import time def main(): # Create a temporary file to store the subprocess output f = tempfile.TemporaryFile() # Start the subprocess and redirect its stdout to the temporary file process = subprocess.Popen(["top"], stdout=f) # Wait for a few seconds time.sleep(2) # Kill the subprocess process.terminate() process.wait() # Seek to the start of the temporary file and read the output f.seek(0) output = f.read() # Close the temporary file f.close() # Print the output of the subprocess print(output) if __name__=="__main__": main()</code>
Cette solution garantit que le programme ne se bloque pas lors de la lecture de la sortie du sous-processus. La méthode subprocess.wait() attend la fin du sous-processus, garantissant que toutes les sorties ont été écrites dans le fichier avant d'y accéder.
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!