atexit — Gestores de Salida


El módulo atexit define funciones para registrar y cancelar el registro de las funciones de limpieza. Las funciones así registradas se ejecutan automáticamente cuando el intérprete se detiene normalmente. El módulo atexit realiza estas funciones en el orden inverso en el que se registraron; si ingresa A, B, y C, cuando el intérprete se detenga, se ejecutarán en el orden C, B, A.

Nota: Las funciones registradas a través de este módulo no se invocan cuando el programa es eliminado por una señal no gestionada por Python, cuando se detecta un error fatal interno en Python o cuando se llama a la función os._exit().

Distinto en la versión 3.7: Cuando se usan con sub-intérpretes API C, las funciones registradas son locales para el intérprete en el que se registraron.

atexit.register(func, *args, **kwargs)

Registra func como una función que se ejecutará cuando el intérprete se detenga. Cualquier argumento opcional que deba pasarse a func debe pasarse como un argumento para la función register(). Es posible registrar las mismas funciones y argumentos más de una vez.

En la finalización normal del programa (por ejemplo, si se llama a la función sys.exit() o finaliza la ejecución del módulo principal), todas las funciones registradas se invocan en el orden último en entrar, primero en salir. Se supone que los módulos de nivel más bajo normalmente se importarán antes que los módulos de nivel alto y, por lo tanto, se limpiarán al final.

Si se lanza una excepción durante la ejecución de los gestores de salida, se muestra un seguimiento de llamada (a menos que se haya lanzado SystemExit) y se guarda la información de la excepción. Después de que todos los controladores de fin de programa hayan tenido la oportunidad de ejecutarse, la última excepción que se lanzó se vuelve a lanzar.

Esta función retorna func, lo que hace posible usarlo como decorador.

atexit.unregister(func)

Elimina func de la lista de funciones que se ejecutarán cuando el intérprete se detenga. Después de llamar a la función unregister(), se garantiza que func no se llamará cuando el intérprete se detenga, incluso si se ha registrado más de una vez. unregister() no hace nada y permanece en silencio en caso de que func no se haya registrado previamente.

Ver también

Módulo readline

Un ejemplo útil del uso de atexit para leer y escribir archivos de historial readline.

Ejemplo con atexit

El siguiente ejemplo simple muestra cómo un módulo puede inicializar un contador desde un archivo cuando se importa, y guardar el valor del contador actualizado automáticamente cuando finaliza el programa, sin necesidad de que la aplicación realice una llamada explícita en este módulo cuando el intérprete se detiene.

try:
    with open("counterfile") as infile:
        _count = int(infile.read())
except FileNotFoundError:
    _count = 0

def incrcounter(n):
    global _count
    _count = _count + n

def savecounter():
    with open("counterfile", "w") as outfile:
        outfile.write("%d" % _count)

import atexit
atexit.register(savecounter)

Los argumentos posicionales y de palabras clave también se pueden pasar a register() para volver a pasar a la función registrada cuando se llama:

def goodbye(name, adjective):
    print('Goodbye, %s, it was %s to meet you.' % (name, adjective))

import atexit
atexit.register(goodbye, 'Donny', 'nice')

# or:
atexit.register(goodbye, adjective='nice', name='Donny')

Usar como un decorator:

import atexit

@atexit.register
def goodbye():
    print("You are now leaving the Python sector.")

Esto solo funciona con funciones que se pueden invocar sin argumentos.