Ответы:
То, что вы ищете в сценарии, это вызовы sys.exit()
. Аргумент этого метода возвращается в среду в качестве кода выхода.
Вполне вероятно, что скрипт никогда не вызывает метод выхода, и что 0 является кодом выхода по умолчанию.
Необязательный аргумент 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), но я не знаю, правильно ли это делать.
grep
нарушает эту тенденцию, выходя с, 1
когда ни одна строка не совпадает и 2
на реальных ошибках. Большое спасибо, Столлман.
Для записи вы можете использовать стандартные коды выхода 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
exitstatus
Пакет PyPI.
Есть errno
модуль, который определяет стандартные коды выхода:
Например, « Отказано в доступе» - это код ошибки 13 :
import errno, sys
if can_access_resource():
do_something()
else:
sys.exit(errno.EACCES)
errno
и errno.h ), но код состояния выхода 77 (согласно os
и sysexits.h ). Программы, которые испускают первое, являются нестандартными ( де-факто vel jure ) и не будут хорошо работать с другими, которые по праву ожидают второе.
Коды выхода 0 обычно означают «здесь все в порядке». Однако, если программист сценария не следовал соглашению, вам, возможно, придется обратиться к источнику, чтобы понять, что это значит. Обычно ненулевое значение возвращается как код ошибки.
Ответ: «Зависит от того, что означает код выхода ноль»
Тем не менее, в большинстве случаев это означает, что «все в порядке»
Мне нравится POSIX:
Итак, на оболочке я бы набрал:
python script.py && echo 'OK' || echo 'Not OK'
Если мой скрипт Python вызывает, sys.exit(0)
оболочка возвращает «ОК»
Если мой скрипт Python вызывает sys.exit(1)
(или любое ненулевое целое число), оболочка возвращает «Не в порядке»
Ваша задача - научиться работать с оболочкой и прочитать документацию (или исходный код) вашего скрипта, чтобы увидеть, что означают коды выхода.
Команды операционной системы имеют коды выхода. Ищите коды выхода Linux, чтобы увидеть некоторые материалы по этому вопросу. Оболочка использует коды выхода, чтобы определить, сработала ли программа, возникли проблемы или произошла ошибка. Прилагаются некоторые усилия для создания стандартных (или, по крайней мере, обычно используемых) кодов выхода. Посмотрите эту публикацию Advanced Shell Script .
Я рекомендую чистое завершение с помощью встроенной функции exit (0), а не sys.exit ()
Я не уверен, если это хороший совет.
Сама упомянутая документация гласит:
Модуль сайта (который импортируется автоматически во время запуска, за исключением случаев, когда указана опция командной строки -S) добавляет несколько констант во встроенное пространство имен. Они полезны для оболочки интерактивного интерпретатора и не должны использоваться в программах .
Затем:
Выход (код = нет)
Объекты, которые при печати печатают сообщение типа «Используйте quit () или Ctrl-D (т.е. EOF) для выхода», а при вызове вызываете SystemExit с указанным кодом выхода.
Если мы сравним его с документацией sys.exit () , он использует тот же механизм, который вызывает SystemExit
исключение.
Если вы хотите использовать стандартные коды выхода POSIX , см. exitstatus
Пакет на PyPI.
Установите пакет:
$ pip install exitstatus
Используйте в своем коде:
import sys
from exitstatus import ExitStatus
sys.exit(ExitStatus.success)
Коды выхода имеют только значение, назначенное автором сценария. Традиция Unix такова, что код выхода 0 означает «успех», а все остальное - неудача. Единственный способ убедиться, что означают коды выхода для данного сценария, - изучить сам сценарий.
Следующие коды выхода Unix 0 - для успеха / OK, 1 - не успеха / ошибки. Вы можете просто использовать exit(0)
или exit(1)
позвонить без импорта sys
модуля.
Чтобы разрешить выполнение обработчиков исключений и других вещей, я рекомендую чистое завершение с помощью exit(0)
встроенной функции, а не использование, sys.exit()
которое резко завершает процесс.
SystemExit
Похоже, что так или иначе поднимается.
os._exit
обоими, кажется, поднять SystemExit
.
sys.exit()
делает выключение чисто, как exit()
. Они оба делают одно и то же : создают SystemExit
исключение. На самом деле, exit()
предназначен для интерактивных сессий, а не сценариев, так что концептуально sys.exit()
это указано. Вы можете быть смущены os._exit()
, это тот, который заканчивается внезапно.