Вопрос

Я осознаю, что die() команда в PHP, которая останавливает скрипт досрочно.

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

Это было полезно?

Решение

import sys
sys.exit()

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

sys.выход([arg])

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

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

С тех пор как exit() в конечном счете “only” вызывает исключение, оно завершит работу только процесс при вызове из основного потока, и исключение не будет перехвачено.

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

Другие советы

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

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

from sys import exit
exit()

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

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

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

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 estdieprogram.py", строка 12, в main() Файл "Z:\Directory estdieprogram.py", строка 8, в main sys.exit() SystemExit

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

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

В 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!");
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top