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будут удалены все её вхождения. При отмене регистрации внутри используются сравнения на равенство (==), поэтому идентичность ссылок на функции не обязана совпадать.
См. также
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 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/atexit.html