Heim > Backend-Entwicklung > Python-Tutorial > Warum bleibt mein Python-„Unterprozess' hängen, wenn er aus der „stdout' eines C-Programms liest?

Warum bleibt mein Python-„Unterprozess' hängen, wenn er aus der „stdout' eines C-Programms liest?

DDD
Freigeben: 2024-11-18 05:07:02
Original
563 Leute haben es durchsucht

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

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)
Nach dem Login kopieren

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)
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage