Завершение выполнения программы в языке Python

Раздел: Основы Python -> Управление выполнением

Основной способ завершения: sys.exit()

Для корректного завершения программы в Python применяется функция sys.exit() из модуля sys. Она поднимает исключение SystemExit, которое перехватывается интерпретатором и позволяет выполнить очистку ресурсов (блоки finally, зарегистрированные функции через atexit). Код завершения передается в качестве аргумента: 0 для успешного завершения, любое ненулевое значение для ошибки.

import sys
sys.exit(0)  # успешное завершение

Python end program (завершение программы в python)

Пояснение:

Код 0 – стандартный индикатор успеха. Ненулевые коды (1, 2 и т.д.) используются для обозначения разных типов ошибок. Также можно передать строку:

sys.exit("Произошла ошибка")

Python окончание программы (завершение программы на python)

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

Типичные ошибки:

  • Вызов sys.exit() внутри потока завершает не только поток, а весь процесс. Для завершения отдельного потока следует использовать return или threading.current_thread().exit().
  • Если sys.exit() находится внутри блока except, исключение SystemExit может быть перехвачено внешним обработчиком – для гарантированного завершения стоит вызвать sys.exit() заново.

Как завершить программу без выполнения очистки?

Для немедленного завершения без вызова finally и функций atexit используется os._exit(). Эта низкоуровневая функция завершает процесс системным вызовом. Применяется в дочерних процессах после fork() или когда необходима гарантированная остановка без задержек.

import os
os._exit(0)

Python exit (код завершения программы в python)

Ошибка: после os._exit() не освобождаются ресурсы (файлы, блокировки) и не выполняются обработчики сигналов. Может возникнуть потеря данных.

Как завершить программу в интерактивной оболочке?

В командной строке Python (IDLE, IPython) доступны функции exit() и quit(). Они созданы для удобства и поднимают SystemExit. В скриптах их применять не следует, так как в некоторых окружениях они могут быть не определены.

exit()   # эквивалентно sys.exit(0)
quit()   # то же самое

Ошибка: при вызове exit() в скрипте, запущенном не в интерактивном режиме, возникает NameError.

Как завершить программу при возникновении исключения?

Можно явно поднять SystemExit с кодом завершения. Это эквивалентно sys.exit(), но не требует импорта sys.

raise SystemExit(1)

Исключение SystemExit наследуется от BaseException, поэтому не перехватывается except Exception. Однако его можно поймать except BaseException – в таком случае программа продолжит работу, если не вызвать повторно sys.exit().

Расширенные примеры завершения программы

Пример 1: Использование atexit для очистки перед sys.exit()

Функции, зарегистрированные через atexit.register(), выполняются при завершении через sys.exit() или естественном окончании скрипта.

Пример
import atexit
import sys

def cleanup():
    print("Очистка ресурсов выполнена")

atexit.register(cleanup)
print("Работа скрипта")
sys.exit(0)
Работа скрипта
Очистка ресурсов выполнена

Пояснение: cleanup() вызывается перед завершением, даже если произошла ошибка.

Пример 2: Завершение дочернего процесса с os._exit()

После fork() дочерний процесс должен завершиться через os._exit(), чтобы не повредить родительский контекст.

Пример
import os
import sys

pid = os.fork()
if pid == 0:
    # дочерний процесс
    print("Дочерний процесс завершается")
    os._exit(0)
else:
    # родительский процесс
    print("Родительский процесс ожидает")
    os.waitpid(pid, 0)
    sys.exit(0)
Родительский процесс ожидает
Дочерний процесс завершается

Пояснение: os._exit() не выполняет очистку, что важно для предотвращения двойного закрытия файлов.

Пример 3: Перехват SystemExit и завершение с другим кодом

Иногда требуется изменить код завершения, перехватив SystemExit.

Пример
import sys

try:
    sys.exit(1)
except SystemExit as e:
    print(f"Перехвачен SystemExit с кодом {e.code}")
    if e.code != 0:
        sys.exit(0)  # меняем код на успешный
Перехвачен SystemExit с кодом 1

Пояснение: после перехвата программа не завершилась автоматически – потребовался повторный вызов sys.exit().

Пример 4: Завершение программы по сигналу SIGTERM

При получении сигнала завершения, например, от системы, можно вызвать sys.exit() для корректного выхода.

Пример
import signal
import sys

def handler(signum, frame):
    print(f"Получен сигнал {signum}")
    sys.exit(0)

signal.signal(signal.SIGTERM, handler)
print("Процесс запущен. Ожидание сигнала...")
signal.pause()

Пояснение: при запуске в фоне и отправке kill процесс завершится через sys.exit() с очисткой.

Пример 5: Завершение с выводом сообщения в stderr

Функция sys.exit() принимает строку, которая выводится в стандартный поток ошибок.

Пример
import sys
sys.exit("Фатальная ошибка: недостаточно памяти")

Результат (вывод в stderr): Фатальная ошибка: недостаточно памяти. Код завершения при этом будет 1.

Пример 6: Завершение по таймеру с использованием threading

Можно запланировать завершение программы через заданный интервал.

Пример
import threading
import sys

def shutdown():
    print("Время вышло, завершаемся")
    sys.exit(0)

timer = threading.Timer(5.0, shutdown)
timer.start()
print("Программа будет работать 5 секунд")
# основной код программы
for i in range(10):
    print(f"Итерация {i}")
    import time
    time.sleep(1)
Программа будет работать 5 секунд
Итерация 0
Итерация 1
Итерация 2
Итерация 3
Итерация 4
Время вышло, завершаемся

Пояснение: таймер вызывает sys.exit(), что прерывает основной цикл.

Код завершения программы в Python - comments

En
Python exit (python)