Как остановить программу в python
Перейти к содержимому

Как остановить программу в python

  • автор:

Как остановить выполнение функции в Python?

Для остановки выполнения функции в Python можно использовать ключевой оператор return . Когда функция достигает этого оператора, она прекращает выполнение и возвращает указанное значение.

def func(): print('Часть функции, где код сработает') x = 11 return x # Функция возвращает значение переменной x и завершает свою работу. print('Эта часть функции - нет') y = 22 return y a = func() print(a) # => Часть функции, где код сработает # => 11 

Завершение программы в Python

Однако, там не было объяснения какой метод лучше. Какой метод является наиболее «безаварийным»? И заодно: есть ли в Python понятие Autocloseable объектов? Если я сделаю ранее завершение программы, нужно ли мне будет закрывать файлы и т.д.?

Отслеживать
7,822 13 13 золотых знаков 25 25 серебряных знаков 55 55 бронзовых знаков
задан 17 окт 2015 в 16:11
1,337 4 4 золотых знака 17 17 серебряных знаков 34 34 бронзовых знака
17 окт 2015 в 16:23
Спасибо! Лучшим решением является использование sys.exit()
17 окт 2015 в 16:28
на счет второго: лучше закрывать/завершать все операции перед завершением программы
17 окт 2015 в 16:32

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Короткий ответ:
Лучше использовать sys.exit()

Механизм завершения процесса в Python реализован через бросание исключения SystemExit , таким образом можно просто создать подобное исключение и программа завершится:

raise SystemExit # или даже передать число -- код ошибки завершения программы raise SystemExit(1) 

Функция exit и аналогичная ей quit созданы для удобства работы в интерактивном режиме и их не рекомендуется использовать внутри скриптов:

They are useful for the interactive interpreter shell and should not be used in programs.

По факту они также просто поднимают исключение, и при попытке вызова без скобок напишут подсказку о правильном способе выхода из интерпретатора:

>>> quit Use quit() or Ctrl-D (i.e. EOF) to exit >>> exit Use exit() or Ctrl-D (i.e. EOF) to exit 

Использовать sys.exit стоит потому, что эта функция лежит в стандартном модуле и будет всегда там доступна. Также это довольно явный способ выразить своё желание завершить программу.

Есть также дополнительный метод для немедленного завершения программы: os._exit . У него довольно специфическая область применения, и там же есть замечание:

The standard way to exit is sys.exit(n)

Т.е. здесь даётся подтверждение того, что стандартный способ завершения программы — это вызов sys.exit .

Функция os.abort , упомянутая вами, использует механизм сигналов процессу. Конкретно при вызове этой функции будет передан сигнал SIGABRT , что в linux приведёт к завершению программы и созданию дампа памяти процесса. Подобное завершение рассматривается операционной системой как аварийное, поэтому не стоит использовать его для безаварийного завершения приложения.

По второй части вопроса. В Python есть развитая система контекстных менеджеров: классов, которые умеют работать с оператором with . Самое частое использование этого механизма встречается, вероятно, с файлами.

with open('filename') as my_file: print(my_file.read()) 

Этот код откроет файл, напечатает его содержимое на экран и закроет файл автоматически, даже если возникнет исключение при его печати.

Для классов, которые не приспособлены для работы с with есть функция closing в библиотеке contextlib . Из документации:

with closing(.open()) as f:

is equivalent to this:

f = .open() try: finally: f.close() 

Вот небольшой пример работы этой функции:

import contextlib class Closeable: def close(self): print('closed') with contextlib.closing(Closeable()): pass # печатает closed 

Теперь небольшое отступление о том, почему стоит использовать конструкцию with .

Известно, что программа завершится от любого необработанного исключения, а не только от SystemExit . Таким образом, если в вашем коде используются какие-то ресурсы, которые требуется правильным образом закрывать перед завершением работы, нужно оборачивать работу с ними в блоки try . finally . .

Однако, при использовании конструкции with это оборачивание происходит автоматически, и все ресурсы закрываются корректно.

Так как выход из программы — это всего лишь брошенное исключение, то и в случае использования функции sys.exit закрытие открытых в операторе with ресурсов произойдёт корректно:

with contextlib.closing(Closeable()): sys.exit() # напечатает closed 

Вы можете писать также и свои классы, предоставляющие ресурсы или классы, оборачивающие другие, которые нужно уметь закрывать автоматически. Для этого используются методы __enter__ и __exit__ .

  1. Похожий вопрос с англоязычного StackOverflow
  2. Функции, добавляемые модулем site
  3. Документация по конструкции with
  4. Документация по функции closing
  5. Документация по исключению SystemExit
  6. Документация по функции os._exit
  7. Документация по функции sys.exit
  8. Документация по функции os.abort
  9. Описание системного сигнала SIGABRT

Как остановить работу программы Python?

Есть программа, которая должна работать до какого-то момента, если не остановить, то бесконечно. Хочу как-нибудь «красиво» останавливать программу, но не знаю как.

  • Вопрос задан более трёх лет назад
  • 27683 просмотра

Комментировать
Решения вопроса 2
Ответ написан более трёх лет назад
Комментировать
Нравится 7 Комментировать

kshnkvn

yay ✌️ t.me/kshnkvn

5e2f3a824d426913983223.jpeg

Ответ написан более трёх лет назад
Нравится 5 4 комментария

Jairman

Jairman @Jairman Автор вопроса
Круто, но не этого хотелось бы

kshnkvn

Jairman, какой вопрос — такой и ответ.
В идеале — скрипт не нужно завершать, у него должно быть логическое завершение. Если есть необходимость останавливать скрипт вручную, то нужно смотреть на сам скрипт, потому что вариантов, как остановить выполнение — куча. Как вариант — обрабатывать исключение KeyboardInterrupt и по нажатию ctrl + c внутри самого скрипта останавливать процессы.

Ivan Yakushenko, вы слишком усложняете) для того что бы иметь статус — Куратор тега Python
вы все правильно говорите, что программа должна логический конец иметь, но судя по вопросу требуется именно тупое прерывание программы в тот момент где захочет ее создатель) программным методом, без пальцев)

kshnkvn

artem_sib, ничего я не усложняю. Для реализации точки выхода из приложения, которая гарантирует завершение всех процессов, нужно смотреть на реализацию самого приложения. А под

Как завершить работу скрипта в Python

Часто в процессе написания программ на Python возникает ситуация, когда необходимо ранее завершить работу скрипта. Такое может потребоваться, например, при обнаружении критической ошибки, которая не позволяет продолжить выполнение программы.

Рассмотрим пример. Допустим, в коде программы предусмотрена проверка наличия файла данных на диске. Если файл отсутствует, то продолжать выполнение программы не имеет смысла и требуется ее завершить.

import os if not os.path.exists('data.txt'): # здесь нужно завершить работу скрипта

В Python для раннего завершения работы скрипта можно использовать функцию exit() из модуля sys . Эта функция принимает один необязательный аргумент — статус завершения, который по умолчанию равен нулю. Если вызвать функцию без аргумента или с аргументом 0 , то это будет воспринято как успешное завершение работы скрипта. Любое другое значение аргумента будет воспринято как код ошибки.

Вот как можно доработать пример выше с использованием exit() :

import os import sys if not os.path.exists('data.txt'): print('Файл данных не найден') sys.exit(1)

Теперь, если при выполнении этого скрипта файл data.txt не будет найден, то скрипт завершит свою работу, и код возврата будет равен 1 . Этот код можно будет использовать для обработки ошибки в других скриптах или системных утилитах.

Важно помнить, что sys.exit() вызывает исключение SystemExit , которое можно перехватить. Если никто не перехватывает это исключение, то Python завершает работу. Если же исключение перехвачено, то функция exit() не вызывает завершение работы интерпретатора.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *