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.

War es hilfreich?

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top