Есть ли метод, который говорит моей программе выйти? - PullRequest
38 голосов
/ 13 мая 2010

Для опции "q" (выход) в меню моей программы у меня есть следующий код:

elif choice == "q":
    print()

Это работало нормально, пока я не поместил его в бесконечный цикл, который продолжал печатать пустые строки. Есть ли способ, который может выйти из программы? Иначе, вы можете придумать другое решение?

Ответы [ 5 ]

80 голосов
/ 13 мая 2010

Один из способов сделать это:

sys.exit(0)

Вам, конечно, нужно будет import sys.

Другой способ - break выйти из вашего бесконечного цикла.Например, вы могли бы сделать это:

while True:
    choice = get_input()
    if choice == "a":
        # do something
    elif choice == "q":
        break

Еще один способ - поместить основной цикл в функцию и использовать return:

def run():
    while True:
        choice = get_input()
        if choice == "a":
            # do something
        elif choice == "q":
            return

if __name__ == "__main__":
    run()

Единственная причина, по которой вам нужноrun() функция при использовании return заключается в том, что (в отличие от некоторых других языков) вы не можете напрямую return из основной части вашего кода Python (части, которая не находится внутри функции).

18 голосов
/ 10 июня 2010

Фактический способ завершить программу, это вызвать

raise SystemExit

Это то, что sys.exit делает, в любом случае .

Обычная SystemExit,или с None в качестве единственного аргумента устанавливает код выхода процесса на ноль.Любое нецелочисленное значение исключения (raise SystemExit("some message")) выводит значение исключения на sys.stderr и устанавливает код выхода на 1. Целочисленное значение устанавливает код выхода процесса на значение:

$ python -c "raise SystemExit(4)"; echo $?
4
11 голосов
/ 13 мая 2010

В Python 3 есть функция exit():

elif choice == "q":
    exit()
3 голосов
/ 13 мая 2010

См. sys.exit. Эта функция закроет вашу программу с заданным статусом выхода.

2 голосов
/ 08 ноября 2013

Обратите внимание, что решения, основанные на sys.exit () или любом исключении, могут не работать в многопоточной среде.

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

Этот ответ от Алекса Мартелли для более подробной информации.

...