Wie schließe ich die stdout-Pipe, wenn ein Prozess beendet wird, der mit dem Python-Unterprozess Popen gestartet wurde?

Ich frage mich, ob es möglich ist, die Kommunikationsleitung herunterzufahren, wenn ein in einem anderen Thread gestarteter Unterprozess beendet wird. Wenn ich nicht communic () anrufe, funktioniert kill () wie erwartet und bricht den Vorgang nach einer statt nach fünf Sekunden ab.

Ich fand eine Diskussion über ein ähnliches ProblemHier, aber ich habe keine richtigen Antworten bekommen. Ich gehe davon aus, dass ich entweder in der Lage sein muss, die Pipe zu schließen oder den Sub-Sub-Prozess (der im Beispiel "sleep" ist) explizit zu beenden und diesen zu beenden, um die Pipe freizugeben.

Ich habe auch versucht, die Antwort auf SO zu finden, aber ich habe nur gefundendiese unddiese unddiese, die dieses problem nicht direkt ansprechen soweit ich das beurteilen kann (?).

Ich möchte also in der Lage sein, einen Befehl in einem zweiten Thread auszuführen und die gesamte Ausgabe abzurufen, ihn aber sofort zu beenden, wenn ich dies möchte. Ich könnte über eine Datei gehen und das oder ähnliches verfolgen, aber ich denke, es sollte einen besseren Weg geben, dies zu tun?

import subprocess, time
from threading import Thread

process = None

def executeCommand(command, runCommand):
    Thread(target=runCommand, args=(command,)).start()

def runCommand(command):
    global process
    args = command.strip().split()
    process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE)

    for line in process.communicate():
        if line:
            print "process:", line,

if __name__ == '__main__':
    executeCommand("./ascript.sh", runCommand)
    time.sleep(1)
    process.kill()

Dies ist das Skript:

#!/bin/bash
echo "sleeping five"
sleep 5
echo "slept five"

Ausgabe

$ time python poc.py 
process: sleeping five

real    0m5.053s
user    0m0.044s
sys 0m0.000s

Antworten auf die Frage(3)

Ihre Antwort auf die Frage