> **Источник:** https://python-all.ru/3.0/library/atexit.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# `atexit` – Обработчики выхода

Модуль `atexit` определяет функции для регистрации и отмены регистрации функций очистки. Зарегистрированные таким образом функции автоматически выполняются при нормальном завершении интерпретатора.

Примечание: функции, зарегистрированные через этот модуль, не вызываются, когда программа завершается по сигналу, когда обнаружена фатальная внутренняя ошибка Python или когда [`os._exit()`](https://python-all.ru/3.0/library/os.html#os._exit) вызывается.

#### `[atexit.register]atexit.register(func[, *args[, **kargs]])`

Регистрирует функцию *func* для выполнения при завершении. Любые необязательные аргументы, которые нужно передать *func*, должны быть переданы как аргументы [`register()`](https://python-all.ru/3.0/library/atexit.html#atexit.register).

При нормальном завершении программы (например, если вызывается [`sys.exit()`](https://python-all.ru/3.0/library/sys.html#sys.exit) или завершается выполнение главного модуля) все зарегистрированные функции вызываются в порядке «последним пришёл – первым обслужен». Предполагается, что модули нижнего уровня обычно импортируются раньше модулей верхнего уровня и, следовательно, должны очищаться позже.

Если во время выполнения обработчиков завершения возникает исключение, выводится трассировка (если только не было возбуждено [`SystemExit`](https://python-all.ru/3.0/library/exceptions.html#exceptions.SystemExit)), а информация об исключении сохраняется. После того как все обработчики завершения отработают, последнее возникшее исключение возбуждается повторно.

Эта функция возвращает *func*, что позволяет использовать её в качестве декоратора без привязки исходного имени к `None`.

#### `[atexit.unregister]atexit.unregister(func)`

Удаляет функцию

*func*

из списка функций для выполнения при завершении работы интерпретатора. После вызова

[`unregister()`](https://python-all.ru/3.0/library/atexit.html#atexit.unregister)

гарантируется, что

*func*

не будет вызвана при остановке интерпретатора.

> **См. также**
>
> **Модуль [`readline`](https://python-all.ru/3.0/library/readline.html#module-readline)**
>
> Полезный пример использования
>
> `atexit`
>
> для чтения и записи
>
> [`readline`](https://python-all.ru/3.0/library/readline.html#module-readline)
>
> файлов истории.

## `atexit` Пример

Следующий простой пример демонстрирует, как модуль может инициализировать счётчик из файла при импорте и автоматически сохранять обновлённое значение счётчика при завершении программы, не полагаясь на явный вызов этого модуля приложением при завершении.

```python
try:
    _count = int(open("/tmp/counter").read())
except IOError:
    _count = 0

def incrcounter(n):
    global _count
    _count = _count + n

def savecounter():
    open("/tmp/counter", "w").write("%d" % _count)

import atexit
atexit.register(savecounter)
```

Позиционные и именованные аргументы также могут быть переданы в [`register()`](https://python-all.ru/3.0/library/atexit.html#atexit.register) для последующей передачи зарегистрированной функции при её вызове:

```python
def goodbye(name, adjective):
    print('Goodbye, %s, it was %s to meet you.' % (name, adjective))

import atexit
atexit.register(goodbye, 'Donny', 'nice')

# или:
atexit.register(goodbye, adjective='nice', name='Donny')
```

Использование в качестве [*декоратора*](https://python-all.ru/3.0/glossary.html#term-decorator):

```python
import atexit

@atexit.register
def goodbye():
    print("You are now leaving the Python sector.")
```

Это, очевидно, работает только с функциями, которые не принимают аргументов.
