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, '')".
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.
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)
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)
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!