atexit
— Обработчики выхода¶
Модуль atexit
определяет функции для регистрации и отмены регистрации функций очистки. Зарегистрированные таким образом функции автоматически выполняются при завершении работы обычного интерпретатора. atexit
выполняет такие функции в реверс порядок, в котором они были зарегистрированы; если вы зарегистрируйтесь A
, B
, и C
, на переводчика расторжения время они будут выполняться в порядке C
, B
, A
.
Примечание: Функции, зарегистрированные с помощью этого модуля, не вызываются, когда программа завершает работу из-за сигнала, не обработанного Python, при обнаружении фатальной внутренней ошибки Python или при вызове os._exit()
.
Примечание: Эффект регистрации или отмены регистрации функций из функции очистки не определен.
Изменено в версии 3.7: При использовании с субинтерпретаторами CAPI зарегистрированные функции являются локальными для интерпретатора, в котором они были зарегистрированы.
- atexit.register(func, *args, **kwargs)¶
Зарегистрируйте func как функцию, которая будет выполнена при завершении. Любые необязательные аргументы, которые должны быть переданы в func, должны быть переданы в качестве аргументов в
register()
. Можно зарегистрировать одну и ту же функцию и аргументы более одного раза.При обычном завершении программы (например, если вызывается
sys.exit()
или завершается выполнение основного модуля) все зарегистрированные функции вызываются в порядке поступления в последнюю очередь. Предполагается, что модули более низкого уровня обычно импортируются раньше модулей более высокого уровня и, следовательно, должны быть очищены позже.Если во время выполнения обработчиков выхода возникает исключение, выводится сообщение обратной трассировки (если не задано значение
SystemExit
) и сохраняется информация об исключении. После того, как все обработчики выхода запустятся, последнее исключение, которое должно быть вызвано, будет вызвано повторно.Эта функция возвращает func, что позволяет использовать ее в качестве декоратора.
- 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')
Использование в качестве decorator:
import atexit
@atexit.register
def goodbye():
print('You are now leaving the Python sector.')
Это работает только с функциями, которые могут быть вызваны без аргументов.