Non conosco le specifiche , ma il modo migliore è ancora di rilevare gli errori (e forse anche tutti gli errori) con il segnale e terminare qualsiasi processo rimanente.
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()
Questo è solo un mockup, avresti bisogno di catturare più di un semplice SIGINT ma l'idea potrebbe iniziare e avresti bisogno di verificare la presenza di processo generato in qualche modo ancora.
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
Mi consiglia di riscrivere una versione personalizzata di check_output
causa come ho appena realizzato check_output è in realtà solo per il semplice ecc debug dal momento che non è possibile interagire tanto con esso durante l'esecuzione di ..
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
e fare quello vuoi con esso, pe raccoglie le esecuzioni attive in una variabile temporanea e le uccide all'uscita con il segnale o altri mezzi di errore/arresto del ciclo principale.
Alla fine, è ancora necessario prendere le terminazioni nell'applicazione principale per poter uccidere in sicurezza qualsiasi bambino, il modo migliore per avvicinarsi a questo è con try & except
o signal
.
[Questo] (http://stackoverflow.com/a/14128476/2235132) risposta potrebbe aiutare. – devnull
Non mi aiuta quando uso il controllo check_output fct, perché non ottengo il pid del processo figlio, quindi non posso ucciderlo ... – Clara
correlato: [Come rendere il processo figlio morire dopo l'uscita del genitore? ] (http://stackoverflow.com/q/284325/4279) e [Il modo migliore per uccidere tutti i processi figlio] (http://stackoverflow.com/q/392022/4279) – jfs