2015-10-12 7 views
7

Hallo, ich habe ein Skript in Python, die in einer Endlosschleife einige Aktionen ausführen, aber manchmal muss ich das Skript zu schließen und aktualisieren Sie es mit einer neuen Version, einige Arbeiten auf dem Server usw.Aktionen vor dem Schließen Python-Skript

die Frage ist, wie kann ich das Skript zu stoppen tun und vor dem schließen es, das Skript einige Aktionen nach der Schleife so nahe sQLite-Verbindung, enge Verbindung mit einem Broker, etc. machen

, was ich jetzt tun ist ctr + c bis zum Anschlag (einige Male vor dem Beenden) und dann sqlite-Verbindung manuell schließen usw.

+2

Sie könnten einen [context manager] (https://www.python.org/dev/peps/pep-0343/) verwenden und in '__exit__' aufräumen, oder ein' except KeyboardInterrupt' oder 'finally' haben auf einen "Versuch". – jonrsharpe

Antwort

7

Sie können ein Signal von einer exe abfangen nett etwas anderes dann 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

Das funktioniert perfekt für mich. Irgendeine Möglichkeit zu fangen, wenn das Terminal auch geschlossen ist? –

+0

Eventuell müssen Sie das 'SIGHUP'-Signal ausgeben - das ist im Grunde das Signal, das an die Prozesse gesendet wird, wenn die Verbindung getrennt wird. – Vor

0

Sie könnten einen try-except Block um Ihre Schleife verwenden und die KeyboardInterrupt Ausnahme fangen. Oder ein finally Block, um auch aufzuräumen, wenn das Programm ordnungsgemäß beendet wird. Der Code sollte dann in etwa so aussehen:

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

Beachten Sie, dass diese Art und Weisen Sie nur den Fall behandeln, wenn Sie Ihr Skript mit einem Tastatur-Interrupt und keinen anderen Fall töten.

könnten Sie verwendet auch die with Anweisung see here for more info (wie in den Kommentaren erwähnt)

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

Bitte bedenken Sie, dass Sie Ihren Post bearbeiten müssen, um weitere Erklärungen dazu zu erhalten, was Ihr Code tut und warum er das Problem löst. Eine Antwort, die meist nur Code enthält (auch wenn es funktioniert), hilft dem OP normalerweise nicht, sein Problem zu verstehen. – SuperBiasedMan

2

Sie das atexit Modul verwenden:

import atexit 

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

atexit.register(cleanup) 

Die cleanup() Funktion auf jedem normalen Beendigung aufgerufen wird (Dazu gehört auch Strg-C).

Verwandte Themen