Ich frage mich, ob es möglich ist, die Kommunikationsleitung herunterzufahren, wenn Sie einen Subprozess beenden, der in einem anderen Thread gestartet wurde. Wenn ich communicate() nicht anrufe, funktioniert kill() wie erwartet und beendet den Prozess nach einer Sekunde statt nach fünf.Wie schließe ich die Stdout-Pipe, wenn Sie einen Prozess beenden, der mit dem Python-Subprozess Popen gestartet wurde?
Ich fand eine Diskussion über ein ähnliches Problem here, aber ich habe keine echten Antworten. Ich nehme an, dass ich entweder in der Lage sein muss, die Pipe zu schließen oder explizit den Sub-Subprozess (im Beispiel "Sleep") zu beenden, und das um die Pipe zu entsperren.
Ich habe auch versucht, auf SO die Antwort, sie zu finden, aber ich fand nur this und this und this, die nicht direkt so weit dieses Problem lösen, wie ich sagen kann (?).
Also die Sache, die ich tun möchte, ist in der Lage, einen Befehl in einem zweiten Thread auszuführen und alle seine Ausgabe zu erhalten, aber in der Lage, es sofort zu töten, wenn ich es wünsche. Ich könnte über eine Datei gehen und das oder ähnlich, 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
Wenn 'process.kill()' genannt wird, './Ascript.sh' stirbt aber der' Schlaf 5' innen nicht. Interessant ist jedoch, dass Python nicht sofort zurückkehrt, nachdem './Ascript.sh' stirbt. –