Maison  >  Article  >  développement back-end  >  Pourquoi mon « sous-processus » Python se bloque-t-il lors de la lecture à partir de la « sortie standard » d'un programme C ?

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

DDD
DDDoriginal
2024-11-18 05:07:02488parcourir

Why Does My Python `subprocess` Hang When Reading from a C Program's `stdout`?

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

Lorsqu'ils tentent d'exécuter un programme C à partir d'un script Python, les utilisateurs peuvent rencontrez un problème de blocage au niveau de l'instruction "for line in iter" dans leur code Python. Cela se produit lors de l'utilisation d'un sous-processus pour lire la sortie du programme C, qui dans ce cas est un programme de test imprimant en continu "2000".

Comprendre le problème

Le la cause première de ce comportement de blocage réside dans la gestion du tampon de sortie standard. Par défaut, les programmes C produisent une sortie tamponnée par blocs, ce qui signifie que les données sont écrites sur la sortie standard en gros morceaux. Lorsque stdout est redirigé vers un tube, comme c'est le cas avec un sous-processus, cette mise en mémoire tampon peut entraîner des retards dans la lecture de la sortie.

Solutions

1. Modifier la mémoire tampon du programme C :

Pour résoudre ce problème, on peut modifier le programme C pour utiliser la sortie standard avec tampon de ligne. Cela garantit que chaque nouvelle ligne est vidée immédiatement, éliminant ainsi les retards liés au tampon.

2. Utiliser un pseudo-TTY :

Une solution alternative consiste à utiliser un pseudo-terminal (pty). Les PTY fournissent une interface pseudo-tty au programme C, lui faisant croire qu'il s'exécute de manière interactive. Cela permet naturellement la mise en mémoire tampon de ligne de la sortie standard.

3. Utiliser des utilitaires spéciaux :

Des utilitaires tels que stdbuf peuvent être utilisés pour modifier le comportement de mise en mémoire tampon des sous-processus sans modifier le code source. Le code Python suivant montre comment utiliser stdbuf :

import subprocess

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

4. Utiliser pexpect :

Pexpect est un module qui simplifie la gestion des ptys. Il peut être utilisé comme suit :

import pexpect

child = pexpect.spawn("./main")
for line in child:
    print(line)

En implémentant ces solutions, le script Python sera capable de lire rapidement la sortie du programme C. Cela résout le problème de blocage au niveau de l'instruction "for line in iter".

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