Heim > Artikel > Backend-Entwicklung > Warum bleibt mein Python-„Unterprozess“ hängen, wenn er aus der „stdout“ eines C-Programms liest?
Python-C-Programm-Unterprozess hängt bei „for line in iter“
Beim Versuch, ein C-Programm aus einem Python-Skript auszuführen, kann es passieren, dass Benutzer stoßen bei der Anweisung „for line in it“ in ihrem Python-Code auf ein hängendes Problem. Dies tritt auf, wenn ein Unterprozess zum Lesen der Ausgabe des C-Programms verwendet wird, bei dem es sich in diesem Fall um ein Testprogramm handelt, das kontinuierlich „2000“ ausgibt.
Das Problem verstehen
Das Die Ursache für dieses hängende Verhalten liegt in der Stdout-Pufferverwaltung. Standardmäßig erzeugen C-Programme eine blockgepufferte Ausgabe, was bedeutet, dass Daten in großen Blöcken nach stdout geschrieben werden. Wenn stdout an eine Pipe umgeleitet wird, wie es bei einem Unterprozess der Fall ist, kann diese Pufferung zu Verzögerungen beim Lesen der Ausgabe führen.
Lösungen
1. C-Programmpufferung ändern:
Um dieses Problem zu beheben, kann man das C-Programm so ändern, dass es zeilengepufferte Standardausgabe verwendet. Dadurch wird sichergestellt, dass jede neue Zeile sofort geleert wird, wodurch pufferbedingte Verzögerungen vermieden werden.
2. Pseudo-TTY verwenden:
Eine alternative Lösung ist die Verwendung eines Pseudo-Terminals (pty). PTYs stellen eine Pseudo-TTY-Schnittstelle zum C-Programm bereit und täuschen ihm vor, dass es interaktiv läuft. Dies ermöglicht natürlich die Zeilenpufferung von stdout.
3. Verwenden Sie spezielle Dienstprogramme:
Dienstprogramme wie stdbuf können verwendet werden, um das Pufferverhalten von Unterprozessen zu ändern, ohne den Quellcode zu ändern. Der folgende Python-Code demonstriert die Verwendung von stdbuf:
import subprocess process = subprocess.Popen(["stdbuf", "-oL", "./main"], stdout=PIPE, bufsize=1) for line in iter(process.stdout.readline, b''): print(line)
4. Verwenden Sie pexpect:
Pexpect ist ein Modul, das die Handhabung von PTYS vereinfacht. Es kann wie folgt verwendet werden:
import pexpect child = pexpect.spawn("./main") for line in child: print(line)
Durch die Implementierung dieser Lösungen kann das Python-Skript die Ausgabe des C-Programms umgehend lesen. Dadurch wird das hängende Problem bei der „for line in iter“-Anweisung behoben.
Das obige ist der detaillierte Inhalt vonWarum bleibt mein Python-„Unterprozess“ hängen, wenn er aus der „stdout“ eines C-Programms liest?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!