Maison  >  Article  >  développement back-end  >  Pourquoi mon sous-processus Python se bloque-t-il lors de la lecture de la sortie du programme C ?

Pourquoi mon sous-processus Python se bloque-t-il lors de la lecture de la sortie du programme C ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-17 19:20:02879parcourir

Why Does My Python Subprocess Hang When Reading C Program Output?

Le sous-processus du programme Python C se bloque à ""for line in iter""

Vous essayez de lire la sortie d'un programme C en utilisant subprocess.Popen en Python, mais le processus est bloqué à la ligne "for line in iter(process.stdout.readline, '')". Il s'agit d'un problème connu avec le sous-processus, dû à la mise en mémoire tampon du flux stdout.

Corrigez directement le tampon stdout dans le programme C

Le flux stdout est mis en mémoire tampon par défaut. Cela signifie que le programme C n’enverra aucune sortie au tube tant que le tampon n’est pas plein. Pour résoudre ce problème, vous pouvez utiliser la fonction setvbuf pour définir le flux stdout sur la mise en mémoire tampon de ligne. Cela amènera le programme C à envoyer la sortie au tube immédiatement après l'écriture de chaque ligne.

Ou utilisez un pseudo-TTY

Une autre option consiste à utiliser un pseudo-TTY. TTY (terminal) pour communiquer avec le programme C. Cela permettra au programme C d'envoyer immédiatement la sortie au tube, même si le flux stdout est mis en mémoire tampon.

Ou corrigez-le sans modifier la source du programme C

Enfin, vous pouvez utiliser l'utilitaire stdbuf pour changer le type de mise en mémoire tampon sans modifier le code source du programme C. Cet utilitaire vous permettra de forcer le programme C à envoyer immédiatement la sortie au tube, même si le flux stdout est mis en mémoire tampon.

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