Wie eine letzte Funktion ausführen, bevor in Python getötet zu werden?
Frage
Gibt es eine Möglichkeit einen letzten Befehl ausgeführt werden soll, bevor ein Python-Skript ausgeführt wird getötet gestoppt wird durch ein anderes Skript, indem sie, Tastatur-Interrupt etc.
Lösung
import time
try:
time.sleep(10)
finally:
print "clean up"
clean up
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
KeyboardInterrupt
Wenn Sie andere OS-Ebene Interrupts zu fangen, Blick auf das Signalmodul:
http://docs.python.org/library/signal.html
Signal Beispiel
from signal import *
import sys, time
def clean(*args):
print "clean me"
sys.exit(0)
for sig in (SIGABRT, SIGBREAK, SIGILL, SIGINT, SIGSEGV, SIGTERM):
signal(sig, clean)
time.sleep(10)
Andere Tipps
Sie könnten das atexit
Modul verwenden. Mit ihm können Sie eine Funktion registrieren, die bei Beendigung des Programms aufgerufen wird. Ein Beispiel von hier: http://docs.python.org/library/atexit.html
try:
_count = int(open("/tmp/counter").read())
except IOError:
_count = 0
def incrcounter(n):
global _count
_count = _count + n
def savecounter():
open("/tmp/counter", "w").write("%d" % _count)
import atexit
atexit.register(savecounter)
Sie können auch bei Programmende übergeben Sie Lage- und Keyword-Parameter an die Funktion aufgerufen werden soll.
Hinweis, dass es einige Umstände in der Dokumentation aufgeführt, in der Handler wird nicht aufgerufen werden:
Hinweis : Die Funktionen über dieses Modul registriert werden nicht aufgerufen, wenn das Programm durch ein Signal getötet wird nicht von Python behandelt, wenn ein Python fatal internen Fehler erkannt wird, oder wenn
os._exit()
genannt wird.
Als solche können Sie wollen auch ein Signal-Handler registrieren.
import signal
import sys
import time
def cleanup(*args):
print 'Exiting'
sys.exit(0)
signal.signal(signal.SIGINT, cleanup)
signal.signal(signal.SIGTERM, cleanup)
while True:
time.sleep(60) # less busy loop
Bitte ein ‚Unknown‘ für ihre Antwort zu nehmen und zu korrigieren es, als ob es meine eigene Antwort war, aber meine Änderungen wurden abgelehnt.
Die zugelassene Antwort enthält einen Fehler, der eine segfault verursachen.
Sie können nicht sys.exit () in einem Signalhandler verwenden, aber Sie können os._exit verwenden, so dass es zu:
from signal import *
import os, time
def clean(*args):
print "clean me"
os._exit(0)
for sig in (SIGABRT, SIGINT, SIGTERM):
signal(sig, clean)
time.sleep(10)
SIGBREAK verwendet werden, wenn die Zielplattform Sie Windows.
Je nach Anwendungsfall und die Notwendigkeit zur Reinigung im Fall von schwerwiegenden Fehlern -. Sie SIGSEGV und SIGILL hinzufügen können aber in der Regel diese wird empfohlen, nicht, da der Programmzustand kann so sein, dass Sie eine Endlosschleife erstellen
Mit der atexit Modul eine Funktion registrieren, die am Ende genannt werden.
import atexit
atexit.register(some_function)