Команды выхода Python - почему так много и когда их следует использовать?

491

Кажется, что Python поддерживает много разных команд, чтобы остановить выполнение скрипта.
Выборы , которые я нашел , являются: quit(), exit(), sys.exit(),os._exit()

Я что-нибудь пропустил? Какая разница между ними? Когда бы вы использовали каждый?

Джонатан
источник
1
Вы пропустилиos.abort()
Далеки

Ответы:

766

Позвольте мне дать некоторую информацию о них:

  1. quit() просто поднимает SystemExit исключение.

    Кроме того, если вы распечатаете его, он выдаст сообщение:

    >>> print (quit)
    Use quit() or Ctrl-Z plus Return to exit
    >>>

    Эта функциональность была включена, чтобы помочь людям, которые не знают Python. В конце концов, одна из наиболее вероятных вещей, которые новичок попытается выйти из Python, - это набрать текст quit.

    Тем не менее, quitследует не использоваться в производстве код. Это потому, что он работает, только если siteмодуль загружен. Вместо этого эту функцию следует использовать только в интерпретаторе.

  2. exit()псевдоним для quit(или наоборот). Они существуют вместе просто для того, чтобы сделать Python более удобным для пользователя.

    Кроме того, он также выдает сообщение при печати:

    >>> print (exit)
    Use exit() or Ctrl-Z plus Return to exit
    >>>

    Однако, вроде бы quit, exitсчитается плохим для использования в производственном коде и должен быть зарезервирован для использования в интерпретаторе. Это потому, что он тоже зависит от siteмодуля.

  3. sys.exit()также поднимает SystemExitисключение. Это означает, что это так же, как quitи exitв этом отношении.

    В отличие от этих двух, однако, sys.exitсчитается хорошим для использования в производственном коде. Это потому, что sysмодуль всегда будет там.

  4. os._exit()выход из программы без вызова обработчиков очистки, очистки буферов stdio и т . д. Таким образом, это не стандартный способ выхода и должен использоваться только в особых случаях. Наиболее распространенным из них является дочерний процесс (ы), созданный os.fork.

    Обратите внимание, что из четырех приведенных методов только этот является уникальным в том, что он делает.

Подводя итог, все четыре метода выхода из программы. Однако первые два считаются плохими для использования в производственном коде, а последний является нестандартным, грязным способом, который используется только в специальных сценариях. Итак, если вы хотите , чтобы выйти из программы , как правило, идут с третьим способом: sys.exit.


Или, что еще лучше, на мой взгляд, вы можете просто сделать то, что sys.exitпроисходит за кадром, и запустить:

raise SystemExit

Таким образом, вам не нужно импортировать в sysпервую очередь.

Тем не менее, этот выбор просто по стилю и зависит только от вас.

mhsmith
источник
2
Но в оболочке ipython quitи exitвыйти из оболочки пока sys.exitнет.
Ли
5
sys.exit()это не надежный способ закрыть Если он вызывается внутри потока, он прервет только этот поток, если он не находится в основном потоке. Это может привести к большому количеству случаев, когда программа продолжается, потому что вызов не был в основном потоке, тем более что некоторые интерпретаторы будут невидимо обрабатывать вызовы.
Эллиот
1
Я голосую за добавление endкоманды, которая будет raise SystemExit. Не понимаю, почему не может быть ничего простого, как в BASIC.
Брайан Бернс
6
@BrianBurns: не стоит добавлять специальный синтаксис и резервировать другое ключевое слово. Это похоже на то, почему printбыло изменено с оператора на функцию. Синтаксис легко добавить, но в этом есть сложность.
user2357112 поддерживает Monica
1
Важны ли скобки при звонке sys.exit()?
Линд
100

Функции * quit() , exit()и sys.exit()функционируют одинаково: они вызывают SystemExitисключение. Таким образом , нет никакой разницы, за исключением того, что sys.exit()всегда доступен , но exit()и quit()доступны только , еслиsite модуль импортируется.

os._exit()Функция является особенным, он выходит сразу , не вызывая каких - либо функций очистки (не вытолкнуть буферы, например). Это разработано для узкоспециализированных случаев использования ... в основном, только у ребенка после os.fork()звонка.

Вывод

  • Используйте exit()или quit()в REPL.

  • Используйте sys.exit()в сценариях, или, raise SystemExit()если хотите.

  • использование os._exit() для дочерних процессов для выхода после вызова os.fork().

Все они могут быть вызваны без аргументов, или вы можете указать статус выхода, например, exit(1)или raise SystemExit(1)выйти со статусом 1. Обратите внимание, что переносимые программы ограничены кодами выхода в диапазоне 0-255, если выraise SystemExit(256) на многих системах это будет получить усеченный, и ваш процесс фактически завершится со статусом 0.

Сноски

* На самом деле, quit()и exit()являются вызываемыми объектами-экземплярами, но я думаю, что можно вызывать их функции.

Дитрих Эпп
источник
50

Различные средства выхода

os._exit():

  • Выйдите из процесса без вызова обработчиков очистки.

exit(0):

  • чистый выход без каких-либо ошибок / проблем.

exit(1):

  • Возникла проблема / ошибка / проблема, и поэтому программа закрывается.

sys.exit():

  • Когда система и питон выключаются; это означает, что после запуска программы используется меньше памяти.

quit():

  • Закрывает файл python.

Резюме

По сути, все они делают одно и то же, однако это также зависит от того, для чего вы это делаете.

Я не думаю, что вы что-то упустили, и я бы порекомендовал привыкнуть quit()илиexit() .

Вы бы использовали sys.exit()иos._exit() основном, если вы используете большие файлы или Python для управления терминалом.

В противном случае в основном используйте exit()или quit().

Майк Уильямсон
источник
42

sys.exit это канонический способ выхода.

Внутренне sys.exitпросто поднимает SystemExit. Однако колл sys.exitболее идиоматичен, чем рейз SystemExitнапрямую.

os.exit это низкоуровневый системный вызов, который завершается напрямую, без вызова каких-либо обработчиков очистки.

quitи exitсуществуют только для обеспечения простого выхода из приглашения Python. Это для новых пользователей или пользователей, которые случайно вошли в приглашение Python и не хотят знать правильный синтаксис. Они могут попытаться набрать exitили quit. Хотя это не приведет к выходу из интерпретатора, оно по крайней мере выдаст сообщение, которое сообщит им выход:

>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
>>> exit()
$

По сути, это просто взлом, который использует тот факт, что интерпретатор печатает __repr__любое выражение, которое вы вводите в приглашении.

oefe
источник