Подтвердить что ты не робот

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

У меня появилось сообщение script xyz.py returned exit code 0. Что это значит?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

[email protected]:~$ python -c ""; echo $?
0
[email protected]:~$ python -c "import sys; sys.exit(0)"; echo $?
0
[email protected]:~$ python -c "import sys; sys.exit(43)"; echo $?
43

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

Ответ 3

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

Например, Permission denied - это код ошибки 13:

import errno, sys

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

Ответ 4

Для записи вы можете использовать стандартные коды выхода 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

Ответ 5

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

Ответ 6

Команды операционной системы имеют коды выхода. Найдите коды выхода Linux, чтобы увидеть некоторые материалы по этому вопросу. Оболочка использует коды выхода, чтобы решить, работает ли программа, возникли проблемы или не удалось. Есть некоторые попытки создать стандартные (или, по крайней мере, обычно используемые) коды выхода. См. Расширенная оболочка Script.

Ответ 7

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

Ответ 8

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

Ответ 9

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

Установите пакет:

pip install exitstatus

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

import sys
from exitstatus import ExitStatus

sys.exit(ExitStatus.success)

Ответ 10

Ответ: "Зависит от того, что означает нулевой код завершения"

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


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

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

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

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

Если мой python script вызывает sys.exit(1) (или любое ненулевое целое число), оболочка возвращает "Не в порядке"

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

Ответ 11

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