Die Verwendung eines Subprozesses zum Ausführen eines C-Programms in Python kann schwierig sein, wenn es darum geht, die Ausgabe zu lesen das C-Programm. In diesem Fall friert das Python-Skript bei „for line in iter(process.stdout.readline, '')“ ein.
Das Problem hier ist die Pufferung. Standardmäßig verwenden C-Programme Blockpufferung für ihre Standardausgabe, wenn sie in eine Pipe schreiben (wie es der Fall ist, wenn das Programm von Python aus ausgeführt wird). Dies bedeutet, dass die Daten erst gelöscht werden, wenn der Puffer voll ist oder das Programm beendet wird.
Es gibt mehrere Möglichkeiten, dieses Problem zu beheben:
1. Ändern Sie das C-Programm:
Fügen Sie setvbuf(stdout, (char *) NULL, _IOLBF, 0); am Anfang des C-Programms, um die Zeilenpufferung zu erzwingen. Dadurch wird der Puffer nach jedem Zeilenumbruch geleert.
2. Verwenden Sie das stdbuf-Tool:
Leiten Sie die Standardausgabe des C-Programms über das stdbuf-Tool um, um das Pufferverhalten zu steuern. Zum Beispiel:
import subprocess process = subprocess.Popen(["stdbuf", "-oL", "./main"], stdout=subprocess.PIPE, bufsize=1) for line in iter(process.stdout.readline, ''): print(line)
3. Pseudo-TTY verwenden:
Verwenden Sie ein Pseudo-TTY, um eine interaktive Terminalumgebung für das C-Programm zu simulieren. Dadurch wird das Programm gezwungen, Zeilenpufferung zu verwenden.
import pexpect child = pexpect.spawn("./main") for line in child: print(line)
4. Von beiden Enden lesen:
Verwenden Sie die Select-Funktion in Python, um gleichzeitig von der Standardausgabe des C-Programms und der Standardausgabe des Python-Skripts zu lesen. Dadurch wird das Python-Skript entsperrt, auch wenn das C-Programm keine Ausgabe erzeugt.
Das obige ist der detaillierte Inhalt vonWarum bleibt mein Python-Unterprozess beim Lesen der Ausgabe eines C-Programms hängen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!