Коды выхода в Python

Я получил сообщение, что script xyz.py returned exit code 0. Что это значит?

Что означают коды выхода в Python? Сколько их там? Какие из них важны?

12 ответов


то, что вы ищете в скрипте вызовы sys.exit(). Аргумент этого метода возвращается в среду в качестве кода выхода.

вполне вероятно, что скрипт никогда не вызывает метод exit, и что 0 является кодом выхода по умолчанию.


С документация sys.exit:

необязательный аргумент arg может быть целое состояние выхода (значение по умолчанию равно нулю) или другого типа объекта. Если это целое число, ноль считается "успешным завершением" и любое ненулевое значение считается "ненормальное прекращение" снарядами и подобный. Большинство систем требуют, чтобы быть в диапазоне 0-127, и производить в противном случае неопределенные результаты. Некоторые системы Конвенции для присвоение конкретных значений конкретные коды выхода, но это как правило, недоразвиты; в Unix программы обычно используют 2 для команды ошибки синтаксиса строки и 1 для всех остальных виды ошибок.

один пример, где коды выхода используются в сценариях оболочки. В bash, вы можете проверить специальную переменную $? для последнего статуса выхода:

me@mini:~$ python -c ""; echo $?
0
me@mini:~$ python -c "import sys; sys.exit(0)"; echo $?
0
me@mini:~$ python -c "import sys; sys.exit(43)"; echo $?
43

лично я пытаюсь использовать коды выхода, которые я нахожу в /usr/include/asm-generic/errno.h (на Linux), но я не знаю, если это правильно.


есть errno модуль, который определяет стандартные коды выхода:

например, доступ запрещен код ошибки 13:

import errno, sys

if can_access_resource():
    do_something()
else:
    sys.exit(errno.EACCES)

для записи вы можете использовать стандартные коды выхода POSIX, определенные здесь.

пример:

import sys, os

try:
    config()
except:
    sys.exit(os.EX_CONFIG) 
try:
    do_stuff()
except:
    sys.exit(os.EX_SOFTWARE)
sys.exit(os.EX_OK) # code 0, all ok

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


команды операционной системы кодов выхода. Ищите коды выхода linux чтобы увидеть некоторые материалы об этом. Оболочка использует коды выхода, чтобы решить, работала ли программа, были ли проблемы или сбой. Предпринимаются определенные усилия по созданию стандартных (или, по крайней мере, часто используемых) кодов выхода. Смотрите это Расширенный Скрипт проводки.


Если вы хотите портативно использовать стандартные коды выхода POSIX см. exitstatus пакет на PyPI.

установить пакет:

pip install exitstatus

используйте в своем коде:

import sys
from exitstatus import ExitStatus

sys.exit(ExitStatus.success)

коды выхода имеют значение только по назначению автора сценария. Традиция Unix заключается в том, что код выхода 0 означает "успех", все остальное-неудача. Единственный способ убедиться, что означают коды выхода для данного скрипта, - это изучить сам скрипт.


коды выхода во многих языках программирования до программистов. Поэтому вам нужно посмотреть исходный код вашей программы (или руководство). Ноль обычно означает "все прошло хорошо".


ответ "зависит от того, что означает нулевой код выхода"

однако в большинстве случаев это означает "все в порядке"


мне нравится POSIX:

Итак, на оболочке я бы напечатал:

python script.py && echo 'OK' || echo 'Not OK'

Если мой скрипт python вызывает sys.exit(0) оболочка возвращает 'OK'

Если мой скрипт python вызывает sys.exit(1) (или любое ненулевое целое число), оболочка возвращает 'not OK'

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


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


Я рекомендую чистое завершение работы со встроенным выходом(0), а не с помощью sys.exit ()

Я не уверен, что это хороший совет.

сама упомянутая документация гласит:

модуль сайта (который импортируется автоматически во время запуска, за исключением опции командной строки-S) добавляет несколько констант во встроенное пространство имен. Они полезны для интерактивной оболочки интерпретатора и не следует использовать в программах.

затем:

выход(код=нет)

объекты, которые при печати печатают сообщение типа "использовать quit () или Ctrl-D (т. е. EOF) для выхода", и при вызове вызывают SystemExit с указанным кодом выхода.

Если мы сравним его с sys.exit () документация, она использует тот же механизм, который вызывает SystemExit исключения.