Heim > Backend-Entwicklung > Python-Tutorial > Warum bleibt mein Python-Unterprozess beim Lesen der Ausgabe eines C-Programms hängen?

Warum bleibt mein Python-Unterprozess beim Lesen der Ausgabe eines C-Programms hängen?

Linda Hamilton
Freigeben: 2024-11-19 00:57:02
Original
766 Leute haben es durchsucht

Why Does My Python Subprocess Hang When Reading Output from a C Program?

Python-C-Programm-Subprozess hängt bei „for line in iter“

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 verstehen: Pufferung

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.

Problem beheben

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

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

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!

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage