Heim >Backend-Entwicklung >Python-Tutorial >Warum bleibt mein Python-„Unterprozess' hängen, wenn ich die Ausgabe eines C-Programms mit „for line in iter(process.stdout.readline, \'\')' lese?
Python-Unterprozess hängt mit „for line in iter“
In diesem Szenario soll das Python-Skript ein C-Programm ausführen und empfangen seine Ausgabe. Das Skript bleibt jedoch in der Zeile „for line in iter(process.stdout.readline, '')“ hängen.
Das Pufferungsproblem
Das Problem entsteht durch ein Pufferproblem. In C-Programmen wird stdout normalerweise blockgepuffert, wenn die Ausgabe über eine Pipeline weitergeleitet wird. Dies bedeutet, dass die Ausgabe gepuffert wird, bis eine bestimmte Menge geschrieben wird oder ein Zeilenumbruch auftritt.
Im C-Programm gibt jede Iteration der while-Schleife „2000“ aus und ruht eine Sekunde lang. Da keine neue Zeile gedruckt wird, wird die Ausgabe gepuffert.
Für Line in Iter Issue
In Python liest subprocess.stdout.readline() die Standardausgabe des untergeordneten Elements Prozess und gibt eine Zeile zurück. Die „for line in iter()“-Schleife durchläuft die von readline() zurückgegebenen Zeilen.
Da die Ausgabe des C-Programms jedoch aufgrund der Pufferung nicht geleert wird, gibt es zu diesem Zeitpunkt keine Zeilen zum Lesen wo das Python-Skript in die Schleife eintritt. Daher wartet das Skript auf unbestimmte Zeit in dieser Zeile.
Lösungen
Pufferung im C-Programm beheben
setvbuf(stdout, (char *) NULL, _IOLBF, 0);
stdbuf -oL ./main
Pseudo-TTY
import pty master_fd, slave_fd = pty.openpty() process = Popen("./main", stdin=slave_fd, stdout=slave_fd, stderr=STDOUT, bufsize=0, close_fds=True)
import pexpect child = pexpect.spawn("./main") for line in child: print line
Durch die Anwendung einer dieser Lösungen wird das Pufferungsproblem gelöst, sodass das Python-Skript die Ausgabe des C-Programms wie erwartet lesen kann.
Das obige ist der detaillierte Inhalt vonWarum bleibt mein Python-„Unterprozess' hängen, wenn ich die Ausgabe eines C-Programms mit „for line in iter(process.stdout.readline, '')' lese?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!