atexit — Обработчики выхода


Модуль atexit определяет функции для регистрации и отмены функций очистки. Функции, таким образом автоматически выполняется при нормальном прекращении интерпретатора. atexit выполняет эти функции в обратном порядке, в котором они были зарегистрированы; если вы зарегистрируете A, B и C, во время окончания интерпретации они будут выполняться в порядке C, B, A.

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

Изменено в версии 3.7: Когда используется с C API для подинтерпретаторов, зарегистрированные функции локального интерпретатора будут зарегистрированы.

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

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

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

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

Функция возвращает func, что дает возможность использовать его в качестве декоратора.

atexit.unregister(func)

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

См.также

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

atexit пример

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

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)

Позиционные и ключевой аргументы могут также передаваться 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.")

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