Spec-Zone.ru › Python 3.13

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, что позволяет использовать её как декоратор.

Предупреждение

Запуск новых потоков или вызов os.fork() из зарегистрированной функции может привести к состоянию гонки: основной поток среды выполнения Python освобождает состояния потоков, пока внутренние процедуры threading или новый процесс пытаются использовать это состояние. Это может привести к сбою, а не к корректному завершению работы.

Изменено в версии 3.12: Попытки запустить новый поток или os.fork() новый процесс из зарегистрированной функции теперь приводят к возникновению RuntimeError.

atexit.unregister(func)

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

См. также

Module 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')

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

import atexit

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

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

© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/atexit.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API