2015-10-12 18 views
7

Ciao ho uno script in python che esegue in un ciclo infinito alcune azioni, ma a volte devo chiudere lo script e aggiornarlo con una nuova versione, fare alcuni lavori nel server, ecc.Azioni prima di chiudere lo script python

la domanda, è come posso fare per fermare la sceneggiatura e prima di chiuderlo, lo script fare alcune azioni dopo il ciclo di stretta connessione SQLite, stretta connessione con un broker, ecc

quello che faccio ora è ctr + c fino a quando non si ferma (riprendi poche volte prima che finisca) e poi chiudi manualmente connessione sqlite, ecc.

+2

È possibile utilizzare un [gestore di contesto] (https://www.python.org/dev/peps/pep-0343/) e riordinare in '__exit__', o avere un' except KeyboardInterrupt' o 'finally' su un 'try'. – jonrsharpe

risposta

7

Puoi prendere un segnale un exe carino qualcosa di diverso allora sys.exit

import signal 
import sys 

def signal_handler(signal, frame): 
    print 'You pressed Ctrl+C - or killed me with -2' 
    #.... Put your logic here ..... 
    sys.exit(0) 

signal.signal(signal.SIGINT, signal_handler) 
+0

Questo funziona perfettamente per me. Qualche possibilità di prendere quando il terminale è chiuso? –

+0

Potrebbe essere necessario cancellare il segnale 'SIGHUP' - questo è fondamentalmente il segnale che viene inviato ai processi quando il terminale si disconnette. – Vor

0

si potrebbe usare un try-except blocco attorno al ciclo e intercettare l'eccezione KeyboardInterrupt. Oppure un blocco finally da ripulire anche se il programma termina in modo ordinato. Il codice dovrebbe quindi essere simile a questa:

try: 
    <your loop goes here> 
except KeyboardInterrupt: 
    <handle error and do possible special cleanup> 
finally: 
    <do the cleanup that always has to happen> 

Si noti che questo modo di gestire solo il caso quando si uccide lo script con un interrupt di tastiera e nessun altro caso.

Si potrebbe anche usato il with dichiarazione see here for more info (come indicato nei commenti)

0
import sys 
try: 
    # Program here 
except KeyboardInterrupt: 
    # Close connections 
    sys.exit(0) 
+1

Considerare la modifica del post per aggiungere ulteriori spiegazioni su cosa fa il codice e perché risolverà il problema. Una risposta che per lo più contiene solo codice (anche se funziona) di solito non aiuta l'OP a capire il loro problema. – SuperBiasedMan

2

è possibile utilizzare il modulo atexit:

import atexit 

def cleanup(): 
    print "cleanup" 
    # close connections, ... 

atexit.register(cleanup) 

La funzione cleanup() sarà chiamata su ogni terminazione normale (questo include Ctrl-C).

Problemi correlati