it-swarm-ru.tech

Завершение сценария Python

Мне известна команда die() в PHP, которая останавливает сценарий на ранней стадии.

Как я могу сделать это в Python?

889
Teifion
import sys
sys.exit()

подробности из sysдокументация модуля :

sys.exit([arg])

Выход из Python. Это реализуется путем вызова исключения SystemExitNAME _ , поэтому действия по очистке, указанные в предложениях finally операторов tryNAME _ , учитываются, и можно перехватить попытку выхода на внешнем уровне.

Необязательный аргумент arg может быть целым числом, указывающим статус выхода (по умолчанию равен нулю), или объектом другого типа. Если это целое число, ноль считается "успешным завершением", а любое ненулевое значение считается "ненормальным завершением" оболочками и т.п. Большинство систем требуют, чтобы он находился в диапазоне 0-127, и в противном случае дают неопределенные результаты. В некоторых системах существует соглашение о назначении определенных значений определенным кодам выхода, но они обычно недостаточно развиты; Программы Unix обычно используют 2 для ошибок синтаксиса командной строки и 1 для всех других видов ошибок. Если передается объект другого типа, None эквивалентен пропусканию нуля, а любой другой объект печатается в stderrNAME _ и приводит к коду выхода 1. В частности, sys.exit("some error message") - это быстрый способ выхода из запрограммировать при возникновении ошибки.

Так как exit() в конечном итоге "only" вызывает исключение, оно выйдет из процесса только при вызове из основного потока, и исключение не перехватывается.

Обратите внимание, что это "хороший" способ выхода. @ glyphtwistedmatrix ниже указывает на то, что если вы хотите "жесткий выход", вы можете использовать os._exit ( errorcode ), хотя он, вероятно, в некоторой степени специфичен для ОС (например, он может не принимать код ошибки в Windows), и он определенно менее дружественен, поскольку не позволяет интерпретатору выполнить какую-либо очистку до того, как процесс завершится.

1203
pjz

Простой способ завершить сценарий Python на раннем этапе - использовать встроенную функцию quit (). Там нет необходимости импортировать любую библиотеку, и это эффективно и просто.

Пример:

#do stuff
if this == that:
  quit()
267
j.m.g.r

Другой способ это:

raise SystemExit
109
Vhaerun

Хотя вы, как правило, предпочитаете sys.exit, потому что он более "дружественный" по отношению к другому коду, все, что он на самом деле делает, это вызывает исключение.

Если вы уверены, что вам нужно немедленно выйти из процесса, и вы можете быть в каком-то обработчике исключений, который будет перехватывать SystemExit, есть другая функция - os._exit - которая немедленно завершается на уровне C и не выполняет никаких обычных разрывов -вниз переводчика; например, хуки, зарегистрированные в модуле "atexit", не выполняются.

62
Glyph

Вы также можете использовать просто exit().

Помните, что sys.exit(), exit(), quit() и os._exit(0) уничтожают интерпретатор Python. Поэтому, если он появляется в сценарии, вызванном из другого сценария функцией execfile(), он останавливает выполнение обоих сценариев.

Смотрите " Остановите выполнение скрипта, вызванного с execfile ", чтобы избежать этого.

60
Space cowboy
from sys import exit
exit()

В качестве параметра вы можете передать код выхода, который будет возвращен в ОС. По умолчанию 0.

26
cleg

Я только что узнал, что при написании многопоточного приложения 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 __== '__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()
22
eaydin

Я новичок, но, конечно, это чище и более контролируемо

def main():
    try:
        Answer = 1/0
        print  Answer
    except:
        print 'Program terminated'
        return
    print 'You wont see this'

if __== '__main__': 
    main()

...

Программа прекращена

чем

import sys
def main():
    try:
        Answer = 1/0
        print  Answer
    except:
        print 'Program terminated'
        sys.exit()
    print 'You wont see this'

if __== '__main__': 
    main()

...

Программа завершила трассировку (последний вызов был последним): файл "Z:\Directory\testdieprogram.py", строка 12, в main () Файл "Z:\Directory\testdieprogram.py", строка 8, в основном sys.exit ( ) SystemExit

Правка

Дело в том, что программа заканчивается плавно и мирно, а не "Я ОСТАНОВЛЕН !!!!"

16
Floggedhorse

В Python 3.5 я пытался включить подобный код без использования модулей (например, sys, Biopy), кроме встроенных, чтобы остановить скрипт и распечатать сообщение об ошибке для моих пользователей. Вот мой пример:

## 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!");
6
David C.