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

Если при выполнении обработчиков завершения возникает исключение, выводится трассировка стека (если не возбуждено 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.13/library/atexit.html

Spec-Zone.ru

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