2010-10-03 8 views
49

¿Cómo se puede tener una función o algo que se ejecutará antes de que se cierre el programa? Tengo un script que se ejecutará constantemente en segundo plano, y lo necesito para guardar algunos datos en un archivo antes de que se cierre. ¿Hay una forma estándar de hacer esto?Hacer algo antes de la salida del programa

+1

¿Cómo se detiene el script? – phimuemue

+1

El script no debe detenerse nunca, pero tal vez alguien mate el proceso o presione Ctrl + \ o algo. – RacecaR

Respuesta

77

Salida del módulo atexit:

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

Por ejemplo, si quería imprimir un mensaje cuando mi solicitud fue terminando:

import atexit 

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

atexit.register(exit_handler) 

Sólo ten en cuenta que esto funciona muy bien para terminación normal de la secuencia de comandos, pero no se llamará en todos los casos (por ejemplo, errores internos fatales).

+2

¿Hay alguna manera de hacer que sea llamado si presiona Ctrl + C o Ctrl + \? – RacecaR

+5

Se llamará si presiona Ctrl + C. Eso simplemente genera una excepción KeyboardInterrupt. –

+1

Oh, lo olvidé. Y supongo que nada de lo que puedas hacer se ejecutará si alguien mata el proceso de Python ¿verdad? – RacecaR

6

Si detiene la secuencia de comandos levantando un KeyboardInterrupt (por ejemplo, presionando Ctrl-C), puede ver eso solo como una excepción estándar. También puede capturar SystemExit de la misma manera.

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

Menciono esto solo para que lo sepa; la forma "correcta" de hacerlo es el módulo atexit mencionado anteriormente.

16

Si quieres que algo se ejecute siempre, incluso en los errores, try de uso: por último: como esto -

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

if __name__=='__main__': 
    main() 

Si desea manejar también excepciones que puede insertar una excepción: antes del fin:

+3

No funciona cuando se produce SIGTERM debido a la muerte del proceso. – ramu

Cuestiones relacionadas