2010-10-03 60 views
49

Comment pouvez-vous avoir une fonction ou quelque chose qui sera exécuté avant que votre programme ne se termine? J'ai un script qui sera constamment exécuté en arrière-plan, et j'en ai besoin pour enregistrer des données dans un fichier avant qu'il ne se termine. Y a-t-il une manière standard de faire ceci?Faire quelque chose avant la sortie du programme

+1

Comment arrêtez-vous le script? – phimuemue

+1

Le script ne devrait jamais s'arrêter, mais peut-être quelqu'un va tuer le processus ou appuyez sur Ctrl + \ ou quelque chose. – RacecaR

Répondre

77

Vérifiez le module atexit:

http://docs.python.org/library/atexit.html

Par exemple, si je voulais imprimer un message lorsque ma demande résiliait:

import atexit 

def exit_handler(): 
    print 'My application is ending!' 

atexit.register(exit_handler) 

Soyez conscient que cela fonctionne très bien pour terminaison normale du script, mais il ne sera pas appelé dans tous les cas (par exemple, des erreurs internes fatales).

+2

Y at-il un moyen de le faire où il sera appelé si vous appuyez sur Ctrl + C ou Ctrl + \? – RacecaR

+5

Il sera appelé si vous appuyez sur Ctrl + C. Cela soulève simplement une exception KeyboardInterrupt. –

+1

Oh, j'ai oublié ça. Et je suppose que rien de ce que vous pouvez faire ne sera exécuté si quelqu'un tue le processus python? – RacecaR

6

Si vous arrêtez le script en élevant un KeyboardInterrupt (par exemple en appuyant sur Ctrl-C), vous pouvez l'attraper comme une exception standard. Vous pouvez également capturer SystemExit de la même manière.

try: 
    ... 
except KeyboardInterrupt: 
    # clean up 
    raise 

Je mentionne cela juste pour que vous sachiez à ce sujet; la «bonne» façon de le faire est le module atexit mentionné ci-dessus.

16

Si vous voulez quelque chose à courir toujours, même en cas d'erreur, utilisez essayer: enfin: comme ça -

def main(): 
    try: 
     execute_app() 
    finally: 
     handle_cleanup() 

if __name__=='__main__': 
    main() 

Si vous voulez gérer également des exceptions vous pouvez insérer une exception: avant la finalement:

+3

Ne fonctionne pas lorsque SIGTERM se produit en raison de la destruction du processus. – ramu