Wie schließe ich die Stdout-Pipe, wenn ich einen mit dem Python-Subprozess Popen gestarteten Prozess abbringe?

9

Ich frage mich, ob es möglich ist, die Kommunikationsleitung herunterzufahren, wenn ein Subprozess in einem anderen Thread gestartet wird. Wenn ich communicate () nicht anrufe, funktioniert kill () wie erwartet und beendet den Prozess nach einer Sekunde statt nach fünf.

Ich fand eine Diskussion über ein ähnliches Problem hier , aber ich habe keine wirklichen Antworten bekommen. Ich nehme an, dass ich entweder in der Lage sein muss, die Pipe zu schließen oder den Sub-Subprozess (im Beispiel "sleep") explizit zu beenden und den Block zu entfernen, um die Pipe zu entsperren.

Ich habe auch versucht, die Antwort auf SO zu finden, aber ich fand nur dies und dies und this , die dieses Problem nicht direkt angehen, soweit ich das beurteilen kann ( ?).

Also möchte ich in der Lage sein, einen Befehl in einem zweiten Thread auszuführen und all seine Ausgabe zu erhalten, aber in der Lage sein, sie sofort zu töten, wenn ich es möchte. Ich könnte über eine Datei gehen und das oder ähnlich, aber ich denke, es sollte einen besseren Weg geben, dies zu tun?

%Vor%

Dies ist das Skript:

%Vor%

Ausgabe

%Vor%     
icecream 26.10.2009, 11:18
quelle

3 Antworten

6

Ich denke, das Problem ist, dass process.kill () nur den unmittelbaren untergeordneten Prozess (bash), nicht die Unterprozesse des bash-Skripts, beendet.

Das Problem und die Lösung sind hier beschrieben:

Verwenden Sie Popen (..., preexec_fn = os.setsid), um eine Prozessgruppe zu erstellen, und os.pgkill, um die gesamte Prozessgruppe zu beenden. zB

%Vor% %Vor%     
richardw 13.09.2011, 04:38
quelle
0

Es scheint mir, dass der einfachste Weg, dies zu tun und die Multithreading-Probleme zu umgehen, darin besteht, ein Kill-Flag vom Hauptthread zu setzen und kurz vor der Kommunikation im scriptlaufenden Thread zu suchen, um das Skript zu beenden Das Flag ist True .

    
Nick Meharry 26.10.2009 16:51
quelle
-1

Es sieht so aus, als wären Sie ein Opfer von Pythons extrem grobkörniger Gleichzeitigkeit. Ändern Sie Ihr Skript wie folgt:

%Vor%

Und dann wird die Ausgabe:

%Vor%

Wenn das gesamte Skript ausgeführt wird, ist die Zeit 10 Sekunden. Es sieht also so aus, als würde der Python-Kontroll-Thread erst laufen, wenn das Bash-Skript schläft. In ähnlicher Weise, wenn Sie Ihr Skript zu diesem ändern:

%Vor%

Dann wird die Ausgabe:

%Vor%

Kurz gesagt, Ihr Code funktioniert logisch implementiert. :)

    
dvogel 26.10.2009 15:30
quelle

Tags und Links