Документация Python неофициальный перевод
Содержание страницы

27.8. atexit – Обработчики завершенияatexit – Exit handlers

Модуль atexit определяет функции для регистрации и отмены регистрации функций очистки. Зарегистрированные таким образом функции автоматически выполняются при нормальном завершении интерпретатора. Порядок вызова функций не определён; если операции очистки зависят друг от друга, их следует обернуть в функцию и зарегистрировать её. Это сохраняет простоту atexit.

Примечание: функции, зарегистрированные через этот модуль, не вызываются, когда программа завершается по сигналу, не обрабатываемому Python, когда обнаружена фатальная внутренняя ошибка Python, или когда вызывается os._exit().

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

Регистрирует func как функцию, которая будет выполнена при завершении. Любые необязательные аргументы, которые должны быть переданы func, необходимо передать в качестве аргументов в register(). Можно зарегистрировать одну и ту же функцию и аргументы несколько раз.

При нормальном завершении программы (например, если вызывается sys.exit() или завершается выполнение главного модуля) все зарегистрированные функции вызываются в порядке «последним пришёл – первым обслужен». Предполагается, что модули нижнего уровня обычно импортируются раньше модулей верхнего уровня и, следовательно, должны очищаться позже.

Если во время выполнения обработчиков завершения возникает исключение, выводится трассировка (если только не было возбуждено SystemExit), а информация об исключении сохраняется. После того как все обработчики завершения отработают, последнее возникшее исключение возбуждается повторно.

Эта функция возвращает func, что позволяет использовать её как декоратор.

atexit.unregister(func)

Удаляет func из списка функций, выполняемых при завершении интерпретатора. После вызова unregister() гарантируется, что func не будет вызвана при завершении интерпретатора, даже если она была зарегистрирована несколько раз. unregister() безмолвно ничего не делает, если func не была зарегистрирована ранее.

См. также

Модуль readline
Полезный пример использования atexit для чтения и записи файлов истории readline.

27.8.1. atexit Примерatexit Example

Следующий простой пример демонстрирует, как модуль может инициализировать счётчик из файла при импорте и автоматически сохранять обновлённое значение счётчика при завершении программы, не полагаясь на явный вызов этого модуля приложением при завершении.

try:
    _count = int(open("counter").read())
except IOError:
    _count = 0

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

def savecounter():
    open("counter", "w").write("%d" % _count)

import atexit
atexit.register(savecounter)

Позиционные и именованные аргументы также могут быть переданы в register() для последующей передачи зарегистрированной функции при её вызове:

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

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

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

Использование в качестве декоратора:

import atexit

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

Это работает только с функциями, которые можно вызывать без аргументов.