Мне известно о команде die()
в PHP, которая останавливает script раньше.
Как я могу сделать это в Python?
Мне известно о команде die()
в PHP, которая останавливает script раньше.
Как я могу сделать это в Python?
import sys
sys.exit()
из sys
документация по модулю:
sys.exit([arg])
Выход из Python. Это осуществляется путем
SystemExit
исключение, поэтому действия очистки, указанные в пунктах finally изtry
заявления соблюдены, и можно перехватить выход на внешний уровень.Необязательный аргумент arg может быть целым числом, дающим статус выхода (по умолчанию - ноль) или другого типа объекта. Если это целое число, нуль считается "успешным завершением", и любое ненулевое значение считается "ненормальным окончанием" оболочками и тому подобным. Большинство систем требуется, чтобы он находился в диапазоне 0-127 и производил результаты undefined в противном случае. Некоторые системы имеют соглашение о назначении конкретных значения для конкретных кодов выхода, но они, как правило, недоразвиты; Программы Unix обычно используют 2 для синтаксиса командной строки ошибок и 1 для всех других ошибок. Если другой тип объекта передается, None эквивалентно передаче нуля, а любой другой объект напечатан на
stderr
и приводит к коду выхода 1. В частности,sys.exit("some error message")
- быстрый способ выхода из программы, когда возникает ошибка.Так как
exit()
, в конечном счете "только" вызывает исключение, он выйдет только процесс при вызове из основного потока, а исключение не перехвачены.
Обратите внимание, что это "хороший" способ выхода. @glyphtwistedmatrix указывает, что если вы хотите "жесткий выход", вы можете использовать os._exit (код ошибки), хотя в некоторой степени он скорее зависит от ОС (он например, не может принимать код ошибки под окнами), и он определенно менее дружелюбен, поскольку он не позволяет интерпретатору выполнять какую-либо очистку до того, как процесс завершится.
Простым способом завершения Python script рано является использование встроенной функции quit(). Нет необходимости импортировать какую-либо библиотеку, и она эффективна и проста.
Пример:
#do stuff
if this == that:
quit()
Другой способ:
raise SystemExit
В то время как вы обычно предпочитаете sys.exit
, потому что он более "дружественный" к другому коду, все, что он на самом деле делает, - это вызывать исключение.
Если вы уверены, что вам нужно немедленно выйти из процесса, и вы можете оказаться внутри какого-либо обработчика исключений, который будет ловить SystemExit
, есть еще одна функция - os._exit
- которая немедленно завершается на уровне C и делает не выполнять никакого нормального срыва переводчика; например, крючки, зарегистрированные в модуле "atexit", не выполняются.
Вы также можете просто использовать exit()
.
Имейте в виду, что sys.exit()
, exit()
, quit()
и os._exit(0)
убить интерпретатор Python. Поэтому, если он появляется в script, вызванном из другого script на execfile()
, он останавливает выполнение обоих скриптов.
См. "Остановить выполнение script с помощью execfile", чтобы избежать этого.
from sys import exit
exit()
В качестве параметра вы можете передать код выхода, который будет возвращен ОС. По умолчанию 0.
Я полный новичок, но, конечно, это более чистый и контролируемый
def main():
try:
Answer = 1/0
print Answer
except:
print 'Program terminated'
return
print 'You wont see this'
if __name__ == '__main__':
main()
...
Программа завершена
чем
import sys
def main():
try:
Answer = 1/0
print Answer
except:
print 'Program terminated'
sys.exit()
print 'You wont see this'
if __name__ == '__main__':
main()
...
Прерванный программой трассировка (последний последний вызов): Файл "Z:\Directory\testdieprogram.py", строка 12, в main() Файл "Z:\Directory\testdieprogram.py", строка 8, в основном sys.exit() SystemExit
Изменить
Дело в том, что программа заканчивается плавно и мирно, а не "Я ОСТАНОВИЛСЯ!!!!"
Я только что узнал, что при написании многопотокового приложения raise SystemExit
и sys.exit()
оба убивают только текущий поток. С другой стороны, os._exit()
завершает весь процесс. Об этом говорилось здесь.
Пример ниже имеет 2 потока. Кенни и Картман. Картман должен жить вечно, но Кенни называют рекурсивно и должен умереть через 3 секунды. (рекурсивный вызов не самый лучший способ, но у меня были другие причины)
Если мы также хотим, чтобы Картман умер, когда Кенни умрет, Кенни должен уйти с os._exit
, иначе только Кенни умрет, и Картман будет жить вечно.
import threading
import time
import sys
import os
def kenny(num=0):
if num > 3:
# print("Kenny dies now...")
# raise SystemExit #Kenny will die, but Cartman will live forever
# sys.exit(1) #Same as above
print("Kenny dies and also kills Cartman!")
os._exit(1)
while True:
print("Kenny lives: {0}".format(num))
time.sleep(1)
num += 1
kenny(num)
def cartman():
i = 0
while True:
print("Cartman lives: {0}".format(i))
i += 1
time.sleep(1)
if __name__ == '__main__':
daemon_kenny = threading.Thread(name='kenny', target=kenny)
daemon_cartman = threading.Thread(name='cartman', target=cartman)
daemon_kenny.setDaemon(True)
daemon_cartman.setDaemon(True)
daemon_kenny.start()
daemon_cartman.start()
daemon_kenny.join()
daemon_cartman.join()
В Python 3.5 я попытался включить подобный код без использования модулей (например, sys, Biopy), кроме встроенного, чтобы остановить script и распечатать сообщение об ошибке моим пользователям. Вот мой пример:
## My example:
if "ATG" in my_DNA:
## <Do something & proceed...>
else:
print("Start codon is missing! Check your DNA sequence!");
exit(); ## as most folks said above
Позже я обнаружил, что более кратким является просто ошибка:
## My example revised:
if "ATG" in my_DNA:
## <Do something & proceed...>
else:
raise ValueError("Start codon is missing! Check your DNA sequence!");