Завершение скрипта Python - PullRequest
       12

Завершение скрипта Python

882 голосов
/ 16 сентября 2008

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

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

Ответы [ 9 ]

1196 голосов
/ 16 сентября 2008
import sys
sys.exit()

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

sys.<strong>exit</strong>([<em>arg</em>])

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

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

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

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

265 голосов
/ 12 февраля 2013

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

Пример:

#do stuff
if this == that:
  quit()
109 голосов
/ 16 сентября 2008

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

raise SystemExit
62 голосов
/ 17 сентября 2008

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

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

59 голосов
/ 22 апреля 2013

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

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

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

26 голосов
/ 16 сентября 2008
from sys import exit
exit()

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

22 голосов
/ 10 ноября 2016

Я только что обнаружил, что при написании многопоточного приложения 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()
16 голосов
/ 19 марта 2014

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

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

if __name__ == '__main__': 
    main()

...

Программа остановлена ​​

1010 * чем *

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, в main sys.exit () SystemExit

Редактировать

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

6 голосов
/ 27 декабря 2016

В 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!");
...