Коды выхода в Python - PullRequest
       81

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

162 голосов
/ 12 ноября 2008

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

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

Ответы [ 12 ]

186 голосов
/ 12 ноября 2008

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

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

85 голосов
/ 13 ноября 2008

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

Необязательный аргумент arg может быть целое число, дающее статус выхода (по умолчанию ноль) или другой тип объекта. Если это целое число, ноль считается «успешным завершением» и любое ненулевое значение считается «Ненормальное завершение» снарядами и подобное, аналогичное, похожее. Большинство систем требуют, чтобы быть в диапазоне 0-127, и производить неопределенные результаты в противном случае. Немного системы имеют соглашение для присвоение конкретных значений конкретные коды выхода, но это как правило, недоразвит; Юникс программы обычно используют 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), но я не знаю, правильно ли это делать.

24 голосов
/ 13 ноября 2008

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

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

import errno, sys

if can_access_resource():
    do_something()
else:
    sys.exit(errno.EACCES)
22 голосов
/ 11 июня 2015

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

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

5 голосов
/ 11 июня 2016

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

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

pip install exitstatus

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

import sys
from exitstatus import ExitStatus

sys.exit(ExitStatus.success)
5 голосов
/ 13 ноября 2008

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

4 голосов
/ 24 января 2017

Ответ: «Зависит от того, что означает код выхода ноль»

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


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

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

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

Если мой скрипт на Python вызывает sys.exit(0), оболочка возвращает «ОК»

Если мой скрипт на Python вызывает sys.exit(1) (или любое другое ненулевое целое число), оболочка возвращает «Not OK»

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

4 голосов
/ 12 ноября 2008

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

3 голосов
/ 12 февраля 2018

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

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

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

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

Тогда:

не

Выход (код = None)

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...