У меня появилось сообщение script xyz.py returned exit code 0
. Что это значит?
Что означают коды выхода в Python? Сколько их там? Какие из них важны?
У меня появилось сообщение script xyz.py returned exit code 0
. Что это значит?
Что означают коды выхода в Python? Сколько их там? Какие из них важны?
То, что вы ищете в script, - это вызов sys.exit()
. Аргумент этого метода возвращается в среду как код выхода.
Довольно вероятно, что script никогда не вызывает метод exit, а 0 - код выхода по умолчанию.
Необязательный аргумент 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), но я не знаю, правильно ли это делать.
Существует модуль errno
, который определяет стандартные коды выхода:
Например, Permission denied - это код ошибки 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 обычно означают "ничего плохого здесь". Однако, если программист script не соответствовал соглашению, вам, возможно, придется обратиться к источнику, чтобы узнать, что это значит. Обычно в качестве кода ошибки возвращается ненулевое значение.
Команды операционной системы имеют коды выхода. Найдите коды выхода Linux, чтобы увидеть некоторые материалы по этому вопросу. Оболочка использует коды выхода, чтобы решить, работает ли программа, возникли проблемы или не удалось. Есть некоторые попытки создать стандартные (или, по крайней мере, обычно используемые) коды выхода. См. Расширенная оболочка Script.
Коды выхода имеют смысл только для автора script. Традиция Unix заключается в том, что код выхода 0 означает "успех", все остальное - сбой. Единственный способ убедиться, что означают коды выхода для данного script, - это изучить сам script.
Коды выхода на многих языках программирования зависят от программистов. Поэтому вам нужно посмотреть исходный код программы (или руководство). Ноль обычно означает "все пошло нормально".
Если вы хотите с возможностью использования стандартных кодов выхода POSIX, см. exitstatus на PyPI.
Установите пакет:
pip install exitstatus
Используйте в своем коде:
import sys
from exitstatus import ExitStatus
sys.exit(ExitStatus.success)
Ответ: "Зависит от того, что означает нулевой код завершения"
Однако в большинстве случаев это означает "Все нормально"
Мне нравится POSIX:
Итак, на оболочке я бы напечатал:
python script.py && echo 'OK' || echo 'Not OK'
Если мой python script вызывает sys.exit(0)
, оболочка возвращает 'OK'
Если мой python script вызывает sys.exit(1)
(или любое ненулевое целое число), оболочка возвращает "Не в порядке"
Это ваша работа, чтобы стать умнее с оболочкой и прочитать документацию (или источник) для вашего script, чтобы увидеть, что означают коды выхода.
Чтобы разрешить обработчики исключений и другие функции, я рекомендую выполнить чистое завершение работы с exit(0)
, а не используя sys.exit()
, который завершает процесс внезапно.