Spec-Zone.ru › Python 3.12

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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/atexit.html

Spec-Zone.ru

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