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

Как приостановить выполнение программы в python

  • автор:

Завершение программы в 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

Метод time.sleep() в Python

Метод python sleep(), используемый для приостановки выполнения для заданного времени (в секундах). Мы можем использовать функцию ожидания python, чтобы остановить выполнение программы за заданное время в секундах. Фактическое время приостановки может быть меньше запрошенного, потому что любой пойманный сигнал прекратит сон() после выполнения ловушки этого сигнала. Кроме того, время приостановки может быть больше, чем запрашивается произвольной суммой из-за планирования другой активности в системе. Вы можете установить задержку в своем скрипте Python, передав количество секунд, которые вы хотите отложить, к функции сна.

import time time.sleep(5) #задержка в течение 5 секунд

Когда вы запустите приведенный выше Пример:, он завершится только через пять секунд.

Метод sleep() поддерживает числа с плавающей запятой, что означает, что вы можете заставить его также ждать доли секунды.

import time time.sleep(1.500)

Когда вы запускаете приведенный выше Пример:, программа ждет завершения 1 секунды и 500 миллисекунд.

time.sleep (1) # sleep в течение 1 секунды time.sleep (60) # сон в течение 1 минуты time.sleep (3600) # сон в течение 1 часа

Задержка времени для бесконечного цикла

Вот еще один пример когда что-то выполняется примерно каждые 5 секунд.

import time while True: print("Thi smessage prints each 5 seconds") time.sleep(5) # Задержка в течение 5 секунд

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

Сон программы

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

import time wait = 10 while wait > 0: print(wait) time.sleep(1) wait = wait - 1

Thread и Sleep

Темы, как правило, содержатся в процессах. В рамках одного процесса может существовать более одного потока. Эти потоки разделяют память и состояние процесса. В следующем примере вы можете увидеть, как метод sleep() работает в многопроцессорной программе.

import time from threading import Thread class Main_Thread(Thread): def run(self): for x in range(100, 104): print(x, " - Main Thread") time.sleep(5) class Service_Thread(Thread): def run(self): for x in range(1, 16): print(x) time.sleep(1) Main_Thread().start() Service_Thread().start()
100 - Main Thread 1 2 3 4 5 101 - Main Thread 6 7 8 9 10 102 - Main Thread 11 12 13 14 15 103 - Main Thread

Точность time.sleep()

Time.sleep (секунды) не в реальном времени. Функция time.sleep() использует функцию sleep() базовой операционной системы, иногда она может быть отключена с точки зрения миллисекунд. Большинство ПК-машин имеют аппаратные ограничения в диапазоне 1-10 мс, независимо от операционной системы. В операционной системе time.sleep() просто означает подсказку. Это не хороший механизм синхронизации, но достаточно хорош для большинства приложений. Как правило, однако, если вы не хотите спать в течение очень небольшого периода времени, вы можете вообще игнорировать эту информацию.

import time sleep_start = time.time() for cnt in range(0,10): print(cnt) time.sleep(1) # 1 sec delay sleep_end = time.time() diff = sleep_end - sleep_start print("Looping time :",diff)
Looping time : 10.040287017822266

Правильный способ приостановить программу Python

Я начинающий в этом, но в соответствии с docs.python.org/2/library/functions.html#input , input(prompt) эквивалентен eval(raw_input(prompt)) . Это, вероятно, не то, что вы хотите.

user100464 19 июнь 2013, в 14:47

@user100464: user100464: Если это Python 3, то все в порядке; input в Py3 такой же, как и в Py2 raw_input . Если это Py3, то у них все в порядке, хотя нет необходимости присваивать возвращаемое значение, если оно никогда не используется.

ShadowRanger 09 июнь 2017, в 01:28
Показать ещё 1 комментарий
Поделиться:

8 ответов

Лучший ответ

Кажется, мне хорошо (или raw_input() в Python 2.X). В качестве альтернативы вы можете использовать time.sleep() , если вы хотите сделать паузу в течение определенного количества секунд.

import time print("something") time.sleep(5.5) # pause 5.5 seconds print("something") 

mhawke 19 июль 2012, в 00:47
Поделиться

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

RandomPhobia 19 июль 2012, в 00:34

Просто используйте print для отображения длинного блока текста, а затем input() или raw_input(‘Press to continue’) в соответствии с вашей версией Python.

mhawke 19 июль 2012, в 00:39

Для длинного блока текста лучше использовать input() (или raw_input() в Python 2.x), чтобы raw_input() у пользователя, а не задержку. Быстрые читатели не захотят ждать задержки, медленные читатели могут захотеть больше времени на задержку, кто-то может быть прерван во время чтения, и может потребоваться намного больше времени и т. Д. Кроме того, если кто-то часто использует программу, он / она она может привыкнуть к тому, как это работает, и ей даже не нужно читать длинный текст. Просто удобнее позволить пользователю контролировать, как долго блок текста отображается для чтения.

steveha 19 июль 2012, в 02:00
Показать ещё 1 комментарий

import os os.system("pause") 

Chan Tzish 02 окт. 2015, в 15:03
Поделиться
Это зависит от Windows, в то время как все существующие ответы не зависят от платформы.
lvc 02 окт. 2015, в 14:26

Я предполагаю, что вы хотите приостановить без ввода

8bitwide 19 июль 2012, в 00:56
Поделиться

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

def pause(): programPause = raw_input("Press the key to continue. ") 

и теперь я могу использовать функцию pause() всякий раз, когда мне нужно, чтобы я писал пакетный файл. Например, в такой программе, как:

import os import system def pause(): programPause = raw_input("Press the key to continue. ") print("Think about what you ate for dinner last night. ") pause() 

Теперь очевидно, что эта программа не имеет цели и предназначена, например, для целей, но вы можете точно понять, что я имею в виду.

ПРИМЕЧАНИЕ. Для Python 3 вам нужно использовать input , а не raw_input

Cether 17 янв. 2016, в 20:43
Поделиться

Как указано mhawke и steveha, лучший ответ на этот точный вопрос будет:

Для длинного блока текста лучше использовать input(‘Press to continue’) (или raw_input(‘Press to continue’) on Python 2.x), чтобы запрашивать пользователя, а не задержку времени. Быстрый читатель не захотят ждать задержки, медленным читателям может потребоваться больше времени на задержка, кто-то может быть прерван во время чтения и много больше времени и т.д. Кроме того, если кто-то много использует программу, он/она может привыкнуть к тому, как это работает, и не нужно даже читать длинные текст. Это просто более удобно, чтобы позволить пользователю контролировать, как долго блок текста отображается для чтения.

ntg 04 авг. 2015, в 09:15
Поделиться

raw_input("Press Enter to continue . ") exit() 

shb2789 09 июнь 2017, в 02:39
Поделиться

Я немного использовал этот метод, однако мне также нравится использовать его как функцию pause (), и я не думаю, что есть необходимость в exit (). def pause (): вернуть raw_input («Нажмите Enter, чтобы продолжить . »)

jacktrader 12 фев. 2018, в 18:51
Определенно, как этот 🙂 Спасибо shb2789
tcratius 14 сен. 2018, в 03:07

У меня был аналогичный вопрос, и я использовал сигнал:

import signal def signal_handler(signal_number, frame): print "Proceed . " signal.signal(signal.SIGINT, signal_handler) signal.pause() 

Итак, вы регистрируете обработчик сигнала SIGINT и приостанавливаете ожидание любого сигнала. Теперь из-за пределов вашей программы (например, в bash) вы можете запустить kill -2 , который отправит сигнал 2 (т.е. SIGINT) в вашу программу python. Ваша программа вызовет ваш зарегистрированный обработчик и продолжит работу.

olean 07 окт. 2015, в 15:10
Поделиться

Обратите внимание, что это не переносимо между платформами, например. на винде нету signal.pause . signal.pause .

kyrill 28 апр. 2019, в 15:40

Я думаю, что лучший способ остановить выполнение — это функция time.sleep(). если вам нужно приостановить выполнение только в определенных случаях, вы можете просто реализовать оператор if, например:

if somethinghappen: time.sleep(seconds) 

вы можете оставить пустую ветку else.

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

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

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

Комментировать
Решения вопроса 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, ничего я не усложняю. Для реализации точки выхода из приложения, которая гарантирует завершение всех процессов, нужно смотреть на реализацию самого приложения. А под

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

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