Подтвердить что ты не робот

Завершение работы Python script

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

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

4b9b3361

Ответ 1

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 (код ошибки), хотя в некоторой степени он скорее зависит от ОС (он например, не может принимать код ошибки под окнами), и он определенно менее дружелюбен, поскольку он не позволяет интерпретатору выполнять какую-либо очистку до того, как процесс завершится.

Ответ 2

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

Пример:

#do stuff
if this == that:
  quit()

Ответ 3

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

raise SystemExit

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

from sys import exit
exit()

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

Ответ 7

Я полный новичок, но, конечно, это более чистый и контролируемый

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

Изменить

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

Ответ 8

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

Ответ 9

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