Sie wissen nicht, die Besonderheiten , aber der beste Weg ist immer noch, Fehler (und vielleicht sogar alle Fehler) mit dem Signal zu fangen und alle verbleibenden Prozesse dort zu beenden.
import signal
import sys
import subprocess
import os
def signal_handler(signal, frame):
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
a = subprocess.check_output(["ls", "-l"], stderr=subprocess.STDOUT)
while 1:
pass # Press Ctrl-C (breaks the application and is catched by signal_handler()
Dies ist nur ein Mock-up, würden Sie mehr als nur SIGINT fangen müssen, aber die Idee könnte Ihnen den Einstieg und Sie würden für erzeugte Prozess überprüfen müssen irgendwie noch.
http://docs.python.org/2/library/os.html#os.kill http://docs.python.org/2/library/subprocess.html#subprocess.Popen.pid http://docs.python.org/2/library/subprocess.html#subprocess.Popen.kill
Ich würde empfehlen, eine personalisierte Version von check_output
Ursache Umschreiben, wie ich mit ihm nur check_output realisiert ist wirklich nur für einfache Fehlersuche usw. interagieren, da Sie nicht so viel während der Ausführung ..
Rewrite check_output:
from subprocess import Popen, PIPE, STDOUT
from time import sleep, time
def checkOutput(cmd):
a = Popen('ls -l', shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
print(a.pid)
start = time()
while a.poll() == None or time()-start <= 30: #30 sec grace period
sleep(0.25)
if a.poll() == None:
print('Still running, killing')
a.kill()
else:
print('exit code:',a.poll())
output = a.stdout.read()
a.stdout.close()
a.stdin.close()
return output
und tun, was Sie mit ihm möchten, pe Sie speichern die aktiven Ausführungen in einer temporären Variablen und töten sie beim Beenden mit einem Signal oder anderen Mitteln, um Fehler/Abschaltungen der Hauptschleife zu erfassen.
Am Ende müssen Sie noch Abschlüsse in der Hauptanwendung, um zu fangen, um sicher alle Childs zu töten, der beste Weg, um diesen Ansatz ist mit try & except
oder signal
.
[Dies] (http://stackoverflow.com/a/14128476/2235132) Antwort helfen könnte. – devnull
Es hilft mir nicht, wenn Sie die check_output fct verwenden, weil ich nicht die pid des Child-Prozesses bekomme, daher kann ich es nicht töten ... – Clara
related: [Wie man Child Prozess sterben nach Eltern-Exits? ] (http://stackoverflow.com/q/284325/4279) und [Beste Methode, alle Kindprozesse zu töten] (http://stackoverflow.com/q/392022/4279) – jfs