2016-03-21 2 views
1

Предполагая, что сценарий Python не выходит из-за какого-либо сбоя (исключение, синтаксическая ошибка), и скрипт не выходит из-за sys.exit или os._exit, как Python выясняет, какой код выхода должен выйти с ?Что такое код выхода Python по умолчанию?

Кажется, что это 0, что имеет смысл, поскольку указывает на отсутствие ошибок в системах * nix. Однако всегда будет так, что он выйдет с 0 (кроме случаев, указанных выше)? Удивительно, что после довольно многого онлайн-поиска я не смог найти ничего, что прямо указывало бы, что оно выйдет с 0, если не указано иное.

ответ

1

sys.exit documents a default exit status of 0 и os._exit's docs specify a UNIX-like OS constant for "normal" exit status, os.EX_OK, но нет документальной гарантии, которую я могу найти для статуса выхода в целом.

Помимо этого, лучшее, что я могу дать вам, что в CPython, то python исполняемый (включая python.exe/pythonw.exe на Windows) реализуется в python.c по телефону Py_Main и возвращая то, что она возвращает; за документированные гарантии на Py_Main, то статус выхода:

0 если интерпретатор выходит нормально (то есть, без исключения), 1 если интерпретатор выходит из-за исключение или 2, если список параметров не представляют действительную командную строку Python.

Обратите внимание, что если поднят в противном случае SystemExit, эта функция не вернет 1, но выйдет из процесса, если Py_InspectFlag не установлен.

так это означает, что просто убегал конец __main__ модуля без активного исключения всегда должен возвращать 0 для CPython, хотя альтернативные переводчики не являются технически требуется сделать то же самое.

+0

Спасибо ShadowRanger. Ответ Мартина Бродхерста (прослеживается через код) подтверждает документацию Py_Main. –

1

Выход с 0 предшествующих Python в течение длительного времени, это часть POSIX standard. Все хорошо воспитанные программы указывают на успешный выход с выходом по умолчанию код 0.

+0

Да, я знаю, что 0 уже давно является стандартом * nix, означающим отсутствие ошибки. Я просто хочу увидеть его в письменной форме (или в исходном коде Python), что он всегда использует 0, если не было исключений, ошибок или явных запросов для выхода –

1

Пайтона 0. Это документировано здесь https://docs.python.org/2/library/exceptions.html#exceptions.SystemExit

Тем не менее, код выхода будет независимо от указано в exit() или quit() функций. Таким образом, если вы используете скрипт, вы всегда должны проверять внутри сценария или документацию скрипта, что будет возвращать этот конкретный скрипт. Например: вы можете запустить python в терминале и просто введите quit(1), и он выйдет с кодом возврата 1, даже если ошибок нет.

+2

Это не совсем правильно, потому что 'SystemExit' не возникает, если скрипт не вызывает 'sys.exit()'. –

3

Если вы посмотрите на cpython source code:

  1. main() в Programs/python.c возвращает возвращаемое значение Py_Main()
  2. Py_Main() в Modules/main.c возвращает значение, возвращаемое run_file()
  3. run_file(), а также в Modules/main.c возвращается не 0 если PyRun_AnyFileExFlags() возвращает ненулевое значение
  4. PyRun_AnyFileExFlags() в Python/pythonrun.c будет exit() в событием исключения SystemExit и поэтому не будет возвращен, если сценарий устанавливает код выхода. Он будет возвращать только ненулевое значение, если оно является внутренней ошибкой.

Таким образом, возвращаемое значение run_file() - это код завершения по умолчанию сценария 0.

Смежные вопросы