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 не была зарегистрирована ранее. Если func была зарегистрирована более одного раза, будет удалено каждое вхождение этой функции в стеке вызовов atexit. Сравнение равенств (==) используется внутренне при снятии с регистрации, поэтому ссылки на функции не обязательно должны иметь совпадающие идентификаторы.

См.также

Модуль 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')
# or:
atexit.register(goodbye, adjective='nice', name='Donny')

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

import atexit

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

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

Вернуться на верх