17.8 Das Programmende – atexit 

Mit dem Modul atexit lassen sich Funktionen registrieren, die nach Programmende aufgerufen werden sollen. Dies kann nützlich sein, um Daten zu sichern, Netzwerkverbindungen zu trennen oder sonstige Aufräumarbeiten durchzuführen.
Zu diesem Zweck implementiert atexit eine Funktion namens register, die als Parameter eine Referenz auf die Funktion erwartet, die am Programmende aufgerufen werden soll.
Im folgenden Beispiel wird eine einfache Funktion registriert, die eine Nachricht auf dem Bildschirm ausgibt:
import atexit print "Programm gestartet" def amEnde(): print "Programm beendet" atexit.register(amEnde)
Ein Programmlauf erzeugt nachstehende Ausgabe:
Programm gestartet Programm beendet
Als zusätzliche Argumente können der register-Funktion beliebig viele Parameter übergeben werden, die beim Aufruf der registrierten Funktion an diese weitergereicht werden. Es können positionsbezogene Parameter und Schlüsselwortparameter gemischt werden.
Das folgende Beispiel lässt den Benutzer so lange neue Zeilen eintippen, bis dieser den String "exit" eingibt. Alle Eingaben werden in einer Liste verwaltet, die am Ende des Programms mit einer durch atexit.register registrierten Funktion in einer Datei gesichert werden:
import atexit eingaben = [] def sichereEingaben(liste): open("eingaben.txt", "w").writelines("\n".join(liste)) atexit.register(sichereEingaben, eingaben) while True: zeile = raw_input() if zeile == "exit": break eingaben += [zeile]
Es ist auch möglich, mehrere Funktionen per atexit.register zu registrieren, indem atexit.register für jede dieser Funktionen aufgerufen wird. Diese werden dann am Programmende nacheinander aufgerufen.
Achtung |
Es kann vorkommen, dass die von atexit registrierten Funktionen nicht aufgerufen werden: zum einen, wenn das Programm nicht normal, sondern durch eine nicht behandelte Ausnahme abgestürzt ist, oder zum anderen, wenn es durch ein Systemsignal direkt beendet wurde. |
Zum anderen kann es Probleme geben, wenn das Programm selbst oder ein Modul die Funktion sys.exitfunc überschreibt. Wenn Sie selbst Module entwickeln, sollten Sie immer atexit.register anstelle von sys.exitfunc benutzen, um zu verhindern, dass Ihr Modul die Aufräumarbeiten des einbindenden Programms behindert. |