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

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

Linda Hamilton
Libérer: 2024-11-19 00:57:02
original
768 Les gens l'ont consulté

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

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

L'utilisation d'un sous-processus pour exécuter un programme C en Python peut être délicate lorsqu'il s'agit de lire la sortie de le programme C. Dans ce cas, le script Python se fige à "for line in iter(process.stdout.readline, '')".

Comprendre le problème : mise en mémoire tampon

Le problème ici est la mise en mémoire tampon. Par défaut, les programmes C utilisent la mise en mémoire tampon de bloc pour leur sortie standard lors de l'écriture dans un tube (comme c'est le cas lors de l'exécution du programme à partir de Python). Cela signifie que les données ne sont pas vidées jusqu'à ce que la mémoire tampon soit pleine ou que le programme se termine.

Résoudre le problème

Il existe plusieurs façons de résoudre ce problème :

1. Modifier le programme C :

Ajouter setvbuf(stdout, (char *) NULL, _IOLBF, 0); au début du programme C pour forcer la mise en mémoire tampon des lignes. Cela videra le tampon après chaque nouvelle ligne.

2. Utilisez l'outil stdbuf :

Redirigez la sortie standard du programme C via l'outil stdbuf pour contrôler le comportement de la mise en mémoire tampon. Par exemple :

import subprocess

process = subprocess.Popen(["stdbuf", "-oL", "./main"], stdout=subprocess.PIPE, bufsize=1)
for line in iter(process.stdout.readline, ''):
    print(line)
Copier après la connexion

3. Utiliser un pseudo-TTY :

Utilisez un pseudo-TTY pour simuler un environnement de terminal interactif pour le programme C. Cela forcera le programme à utiliser la mise en mémoire tampon de ligne.

import pexpect

child = pexpect.spawn("./main")
for line in child:
    print(line)
Copier après la connexion

4. Lire des deux côtés :

Utilisez la fonction de sélection en Python pour lire simultanément à la fois la sortie standard du programme C et la sortie standard du script Python. Cela débloquera le script Python même si le programme C ne produit aucune sortie.

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