Перейти к содержимому

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

  • автор:

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

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

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

Комментировать
Решения вопроса 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 понятие Autocloseable объектов? Если я сделаю ранее завершение программы, нужно ли мне будет закрывать файлы и т.д.?

Отслеживать
7,797 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 скрипт в консоли командой?

python

  • Python
  • +3 ещё

Как сделать так, чтобы при регистрации пользователя в телеграмм боте его ID сохранялся в файле только один раз?

  • 1 подписчик
  • 24 минуты назад
  • 18 просмотров

python

  • Python

Как в пайтон вводя имя переменной вызвать её?

  • 1 подписчик
  • 50 минут назад
  • 31 просмотр

python

  • Python
  • +2 ещё

Python как получить данные из 1С находящейся на удаленном рабочем столе?

  • 1 подписчик
  • 4 часа назад
  • 41 просмотр

python

  • Python
  • +1 ещё

Не отображаются виджеты, приложение виснет, где ошибка?

  • 1 подписчик
  • 4 часа назад
  • 22 просмотра

python

  • Python
  • +1 ещё

Как отфильтровать текст Python?

  • 1 подписчик
  • 6 часов назад
  • 57 просмотров

python

  • Python
  • +3 ещё

Почему tesserat не распознает цифры? Зачеркнутый текст?

  • 1 подписчик
  • 9 часов назад
  • 31 просмотр

python

  • Python
  • +1 ещё

Почему не устанавливается aiogram?

  • 1 подписчик
  • 11 часов назад
  • 63 просмотра

python

  • Python
  • +1 ещё

Где ошибка в минимальном примере Celery?

  • 1 подписчик
  • 17 часов назад
  • 37 просмотров

python

  • Python
  • +1 ещё

Telethon не отправляет кнопки в канал, почему?

  • 1 подписчик
  • 18 часов назад
  • 34 просмотра

python

  • Python
  • +2 ещё

Почему тг бот на aiogram выдаёт ошибку?

  • 1 подписчик
  • 21 час назад
  • 41 просмотр

До 250 000 ₽

от 120 000 до 240 000 ₽

До 350 000 ₽

08 янв. 2024, в 20:24

3000 руб./за проект

08 янв. 2024, в 20:10

500 руб./за проект

08 янв. 2024, в 19:59

50000 руб./за проект

Минуточку внимания

Присоединяйтесь к сообществу, чтобы узнавать новое и делиться знаниями

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

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