atexit — Обработчики завершения
Модуль atexit определяет функции для регистрации и отмены регистрации функций очистки. Функции, зарегистрированные таким образом, автоматически выполняются при нормальном завершении интерпретатора. atexit выполняет эти функции в обратном порядке, в котором они были зарегистрированы; если вы зарегистрируете A, B, и C, при завершении интерпретатора они будут выполнены в порядке C, B, A.
Примечание: Функции, зарегистрированные с помощью этого модуля, не вызываются, когда программа убита сигналом, не обработанным Python, когда обнаружена внутренняя ошибка Python или когда вызвана os._exit().
-
atexit.register(func, *args, **kargs) -
Зарегистрировать func как функцию, которая должна быть выполнена при завершении. Любые необязательные аргументы, которые должны быть переданы в func, должны быть переданы как аргументы в
register(). Можно зарегистрировать одну и ту же функцию и аргументы более одного раза.При нормальном завершении программы (например, если вызвана
sys.exit()или завершается выполнение основного модуля), все зарегистрированные функции вызываются в порядке «последний вошел — первый вышел». Предполагается, что модули нижнего уровня обычно импортируются до модулей более высокого уровня, и поэтому их очистка должна выполняться позже.Если при выполнении обработчиков завершения возникает исключение, выводится traceback (если не возникает
SystemExit), а информация об исключении сохраняется. После того как все обработчики завершения выполнились, повторно возникает последнее возникшее исключение.Эта функция возвращает func, что позволяет использовать её как декоратор.
-
atexit.unregister(func) -
Удалить func из списка функций, которые должны быть выполнены при завершении интерпретатора. После вызова
unregister(), func гарантированно не будет вызван при завершении интерпретатора, даже если он был зарегистрирован более одного раза.unregister()молча ничего не делает, если func ранее не был зарегистрирован.
См. также
1. Пример 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–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/atexit.html