Мне известна die()
команда в PHP, которая рано выходит из скрипта.
Как я могу сделать это в Python?
источник
Мне известна die()
команда в PHP, которая рано выходит из скрипта.
Как я могу сделать это в Python?
import sys
sys.exit()
детали из sys
документации модуля :
sys.exit([arg])
Выход из Python. Это реализуется путем вызова
SystemExit
исключения, поэтому действия по очистке, указанные в предложениях finally,try
выполняются, и можно перехватить попытку выхода на внешнем уровне.Необязательный аргумент arg может быть целым числом, указывающим статус выхода (по умолчанию равен нулю), или объектом другого типа. Если это целое число, ноль считается «успешным завершением», а любое ненулевое значение считается «ненормальным завершением» в оболочках и т.п. Большинство систем требуют, чтобы он находился в диапазоне 0-127, и в противном случае дают неопределенные результаты. В некоторых системах есть соглашение о назначении определенных значений определенным кодам выхода, но они обычно недостаточно развиты; Программы Unix обычно используют 2 для ошибок синтаксиса командной строки и 1 для всех других видов ошибок. Если передается объект другого типа, None эквивалентен пропусканию нуля, а любой другой объект печатается в
stderr
и приводит к коду выхода 1. В частности,sys.exit("some error message")
быстрый способ выхода из программы при возникновении ошибки.Поскольку в
exit()
конечном итоге «only» вызывает исключение, оно будет выходить из процесса только при вызове из основного потока, и исключение не перехватывается.
Обратите внимание, что это «хороший» способ выхода. @ glyphtwistedmatrix ниже указывает на то, что если вы хотите «жесткий выход», вы можете использовать его os._exit(*errorcode*)
, хотя он, вероятно, в некоторой степени специфичен для ОС (например, он может не принимать код ошибки в Windows) и определенно менее дружественен, так как не позволяет переводчику выполнять очистку до того, как процесс завершится.
sys.exit()
, не работает (не убивает процесс, просто убивает поток), если вызвано фоновым потоком?sys.exit()
возникаетSystemExit
исключение в текущей теме.UserWarning: To exit: use 'exit', 'quit', or Ctrl-D. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
Простой способ досрочного завершения скрипта Python - это использование встроенной
quit()
функции. Там нет необходимости импортировать любую библиотеку, и это эффективно и просто.Пример:
источник
Другой способ это:
источник
sys.exit
Вы также можете использовать просто
exit()
.Имейте в виду , что
sys.exit()
,exit()
,quit()
иos._exit(0)
убить интерпретатор Python. Следовательно, если он появляется в сценарии, вызванном из другого сценарияexecfile()
, он останавливает выполнение обоих сценариев.Смотрите « Остановите выполнение скрипта, вызванного с execfile », чтобы избежать этого.
источник
Хотя вы, как правило, предпочитаете,
sys.exit
потому что он более «дружественный» по отношению к другому коду, все, что он на самом деле делает, это вызывает исключение.Если вы уверены, что вам нужно немедленно выйти из процесса, и вы можете оказаться в каком-то обработчике исключений, который будет перехватывать
SystemExit
, есть другая функция,os._exit
которая немедленно завершается на уровне C и не выполняет никакого обычного завершения. переводчика; например, хуки, зарегистрированные в модуле "atexit", не выполняются.источник
Я только что узнал, что при написании многопоточного приложения,
raise SystemExit
иsys.exit()
оба убивают только работающий поток. С другой стороны,os._exit()
выходит весь процесс. Это обсуждалось в разделе « Почему sys.exit () не завершается при вызове внутри потока в Python? ».Пример ниже имеет 2 потока. Кенни и Картман. Картман должен жить вечно, но Кенни вызывается рекурсивно и должен умереть через 3 секунды. (рекурсивный вызов не лучший способ, но у меня были другие причины)
Если мы также хотим, чтобы Картман умер, когда умрет Кенни, Кенни должен уйти
os._exit
, иначе умрет только Кенни, и Картман будет жить вечно.источник
В качестве параметра вы можете передать код выхода, который будет возвращен в ОС. По умолчанию 0.
источник
exit()
иsys.exit()
это не одно и то же. Не используйте встроенныеexit()
скрипты, это всего лишь помощник для интерактивной оболочки - используйтеsys.exit()
Я новичок, но, конечно, это чище и более контролируемо
...
чем
...
редактировать
Дело в том, что программа заканчивается гладко и мирно, а не "Я ОСТАНОВЛЕН !!!!"
источник
return
для завершения сценария. Все, чтоreturn
нужно сделать, это вернуть значение и поток управления вызывающей функции. Там он продолжает выполнение сразу после вызова функции, которая вызвалаreturn
. Конечно, еслиreturn
последний оператор в вашем сценарии, как в вашем примере, сценарий завершается сразу после его вызова.exit
- следовательно, программисты на python могут не заметить запах этого кода так сильно); и, наконец, (3) многопоточный код (который питонисты исторически просто игнорировали).В Python 3.5 я пытался включить подобный код без использования модулей (например, sys, Biopy), кроме встроенных, чтобы остановить скрипт и вывести сообщение об ошибке моим пользователям. Вот мой пример:
Позже я обнаружил, что более кратким является просто выдать ошибку:
источник
Мои два цента.
Python 3.8.1, Windows 10, 64-битная.
sys.exit()
не работает напрямую для меня.У меня есть несколько следующих петель.
Сначала я объявляю логическую переменную, которую я вызываю
immediateExit
.Итак, в начале кода программы я пишу:
Затем, начиная с самого внутреннего (вложенного) цикла, я пишу:
Затем я перехожу к непосредственному продолжению внешнего цикла и, прежде чем что-либо еще, выполняемое кодом, напишу:
В зависимости от сложности, иногда вышеупомянутое утверждение необходимо повторять также в разделах и т. Д.
Настраиваемое сообщение также предназначено для моей личной отладки, так как числа предназначены для той же цели - чтобы увидеть, где на самом деле выходит сценарий.
В моем конкретном случае я обрабатываю файл CSV, который я не хочу, чтобы программное обеспечение касалось, если оно обнаруживает, что оно повреждено. Поэтому для меня очень важно выйти из всего скрипта Python сразу после обнаружения возможного повреждения.
И после постепенного выхода из всех циклов мне удается это сделать.
Полный код: (некоторые изменения были необходимы, потому что это собственный код для внутренних задач):
источник
except:
без исключений типа. Если вы просто используетеexcept Exception:
(или даже более подробный тип исключения, если это возможно), онsys.exit()
будет работать как задумано, и вам не понадобится этот обходной путь.sys.exit()
действительно своего рода последнее средство для решения критических ошибок. Просто мои два цента :)