





Коды выхода 0 обычно означают «здесь ничего плохого». Однако, если программист сценария не следовал соглашению, вам, возможно, придется проконсультироваться с источником, чтобы узнать, что это означает. Обычно в качестве кода ошибки возвращается ненулевое значение.
Коды выхода имеют только значение, назначенное автором сценария. Традиция Unix заключается в том, что код выхода 0 означает «успех», все остальное - неудача. Единственный способ узнать, что означают коды выхода для данного сценария, - это изучить сам сценарий.
Коды выхода на многих языках программирования принадлежат программистам. Поэтому вам нужно посмотреть исходный код вашей программы (или руководство). Ноль обычно означает «все прошло нормально».
Вы ищете в скрипте вызовы sys.exit(). Аргумент этого метода возвращается в среду как код выхода.
Весьма вероятно, что сценарий никогда не вызывает метод выход и что 0 - это код выхода по умолчанию.
Совершенно не уверен. В Unix / Linux стандарт: exit 0 в случае, если все в порядке. Введите команду, затем echo $ ?: если вы прочитаете 0, она вернется без ошибок. Идея состоит в том, чтобы иметь стандартные тесты. Если код xyz.py не обнаружил ошибок, он ДОЛЖЕН вернуть 0!
Если вы хотите изменить код выхода, предпочтите выйти чисто с помощью встроенного выхода, см. этот ответ
@vidstige: "встроенный" exit() (на самом деле он не является встроенным постоянно; например, он не будет существовать, когда Python запускается с переключателем -S) - это решение неправильный; вам нужен sys.exit() (который на самом деле выходит чисто / последовательно), а не exit() (который разрешается заменять странными вещами инструментами, где sys.exit обычно должен оставаться нетронутым). Функция «нечистого выхода» - это os._exit(), которая завершается внезапно (она используется в основном для уничтожения рабочих в сценариях fork на основе multiprocessing, чтобы избежать вызова очистки, которую родительский процесс установил до fork).
The optional argument arg can be an integer giving the exit status (defaulting to zero), or another type of object. If it is an integer, zero is considered “successful termination” and any nonzero value is considered “abnormal termination” by shells and the like. Most systems require it to be in the range 0-127, and produce undefined results otherwise. Some systems have a convention for assigning specific meanings to specific exit codes, but these are generally underdeveloped; Unix programs generally use 2 for command line syntax errors and 1 for all other kind of errors.
Один из примеров использования кодов выхода - сценарии оболочки. В 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), но не знаю, правильно ли это делать.
Из другого поста я нашел эту ссылку: tldp.org/LDP/abs/html/exitcodes.html Может быть полезно. :)
errno.h обычно используется для кодов завершения вызова функций. Попытки стандартизировать коды выхода программы привели к тому, что /usr/include/sysexits.h присутствует в большинстве систем POSIX.
Очень хорошо знать, что «программы Unix обычно используют 2 для синтаксических ошибок командной строки»!
@dantiston Concur. Непоколебимый защитник Gentoo, но я этого не знал ... до этого рокового дня. (Теперь мой стыд заканчивается.) В связи с этим обратите внимание, что grep ломает эту тенденцию, выходя с 1, когда ни одна линия не совпадает, и 2 при фактических ошибках. Большое спасибо, Столмен.
Команды операционной системы имеют коды выхода. Найдите Коды выхода Linux, чтобы увидеть материал по этому поводу. Оболочка использует коды выхода, чтобы определить, сработала ли программа, возникли проблемы или не удалось. Есть некоторые попытки создать стандартные (или, по крайней мере, часто используемые) коды выхода. См. Это сообщение Расширенный сценарий оболочки.
Есть модуль errno, который определяет стандартные коды выхода:
Например, В доступе отказано - это код ошибки 13:
import errno, sys
if can_access_resource():
do_something()
else:
sys.exit(errno.EACCES)
Это неверно. Эти errno не предназначены для использования в качестве кодов завершения процесса. Это коды ошибок низкого уровня, предназначенные для внутреннего использования в программах, особенно написанных на языке C. Для Python по возможности используйте исключения.
Ты прав. Они предназначены для внутреннего использования. Но обычно вы не вызываете исключения на уровне конечного пользователя. Вы используете sys.exit (x), где x - целое число, которое вы выбираете произвольно. Но вы можете использовать те, которые начинаются с EX_ и определены в модуле 'os'. Как os.EX_OK или os.EX_IOERR
Извините, но я также отрицательно отношусь к этому, потому что это вводит в заблуждение. Коды состояния выхода и номера ошибок нет взаимозаменяемы / дополняют друг друга. Используя данный пример, «разрешение отклонено» имеет код ошибки, равное 13 (согласно errno и errno.h), но код статуса выхода, равное 77 (согласно os и sysexits.h). Программы, которые генерируют первое, нестандартны (де-факто vel jure) и не будут хорошо работать с другими, которые справедливо ожидают второго.
Для записи вы можете использовать стандартные коды выхода 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
Согласно документы, они доступны только в операционных системах Unix, поэтому не являются полностью переносимыми.
Если вам нужны переносимые коды POSIX, доступные во всех операционных системах, см. Пакет PyPI exitstatus.
Полный пакет равен 0 в случае успеха и 1 в случае неудачи.
Если вы хотите переносно использовать стандартные коды выхода 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 вызывает sys.exit(0), оболочка возвращает «ОК»
Если мой сценарий Python вызывает sys.exit(1) (или любое целое число, отличное от нуля), оболочка возвращает «Not OK».
Ваша задача - сообразить оболочку и прочитать документацию (или исходный код) для вашего скрипта, чтобы увидеть, что означают коды выхода.
Для полноты картины будет напечатано «Not OK», если скрипт Python вызвал ошибку ИЛИ имел синтаксическую ошибку.
Чтобы разрешить выполнение обработчиков исключений и других вещей, я рекомендую полное завершение работы с помощью встроенного exit(0) вместо использования sys.exit(), который внезапно завершает процесс.
Так в чем разница? Откуда эта информация? Вы имеете в виду выполнение обработчиков "при выходе" или что именно вы имеете в виду? SystemExit, похоже, поднимается в любом случае.
мм, перепутал с os._exit, оба вроде SystemExit поднимают.
Неправильно: sys.exit()делает завершает работу чисто, как и exit(). Оба они выполняют функцию такой же: вызывают исключение SystemExit. На самом деле exit() предназначен для интерактивных сессий, а не для скриптов, поэтому концептуально sys.exit()является - указанный. Возможно, вы запутаетесь с os._exit(), который резко обрывается.
Добавление к @MestreLion: exit() даже не является полностью встроенным; заклинило во встроенные постфактум при импорте модуля site. В большинстве случаев это происходит неявно, но для скриптов Python, которые пытаются работать быстро и не полагаются на сторонние модули (установленные в site-packages), их можно запустить с переключателем -S, чтобы полностью отключить импорт site, и exit() не будет существовать (sys.exit() по-прежнему будет).
I recommend a clean shutdown with the exit(0) builtin rather than using sys.exit()
Я не уверен, что это хороший совет.
Сама упомянутая документация читает:
The site module (which is imported automatically during startup, except if the -S command-line option is given) adds several constants to the built-in namespace. They are useful for the interactive interpreter shell and should not be used in programs.
Затем:
exit(code=None)
Objects that when printed, print a message like “Use quit() or Ctrl-D (i.e. EOF) to exit”, and when called, raise SystemExit with the specified exit code.
Если мы сравним его с документацией sys.exit (), он использует тот же механизм, который вызывает исключение SystemExit.
После Коды выхода Unix0 - для успеха / ОК, 1 - неуспеха / ошибки. Вы можете просто использовать вызов exit(0) или exit(1) без импорта модуля sys.
Где вы видите это сообщение?