Завершение выполнения программы в языке 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(), что прерывает основной цикл.