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