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

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

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

Где вы видите это сообщение?

Jeremy Cantrell 13.11.2008 00:15

@Jeremy Внизу PythonWin.

sundeep 13.11.2008 00:19
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
237
2
525 645
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

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

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

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

Ответ принят как подходящий

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

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

Совершенно не уверен. В Unix / Linux стандарт: exit 0 в случае, если все в порядке. Введите команду, затем echo $ ?: если вы прочитаете 0, она вернется без ошибок. Идея состоит в том, чтобы иметь стандартные тесты. Если код xyz.py не обнаружил ошибок, он ДОЛЖЕН вернуть 0!

Bruno von Paris 15.10.2012 13:20

Если вы хотите изменить код выхода, предпочтите выйти чисто с помощью встроенного выхода, см. этот ответ

vidstige 10.03.2017 16:14

@vidstige: "встроенный" exit() (на самом деле он не является встроенным постоянно; например, он не будет существовать, когда Python запускается с переключателем -S) - это решение неправильный; вам нужен sys.exit() (который на самом деле выходит чисто / последовательно), а не exit() (который разрешается заменять странными вещами инструментами, где sys.exit обычно должен оставаться нетронутым). Функция «нечистого выхода» - это os._exit(), которая завершается внезапно (она используется в основном для уничтожения рабочих в сценариях fork на основе multiprocessing, чтобы избежать вызова очистки, которую родительский процесс установил до fork).

ShadowRanger 02.12.2020 17:19

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

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 Может быть полезно. :)

Eigir 20.11.2008 14:10

errno.h обычно используется для кодов завершения вызова функций. Попытки стандартизировать коды выхода программы привели к тому, что /usr/include/sysexits.h присутствует в большинстве систем POSIX.

mpounsett 10.01.2012 06:43

Очень хорошо знать, что «программы Unix обычно используют 2 для синтаксических ошибок командной строки»!

dantiston 19.03.2015 02:34

@dantiston Concur. Непоколебимый защитник Gentoo, но я этого не знал ... до этого рокового дня. (Теперь мой стыд заканчивается.) В связи с этим обратите внимание, что grep ломает эту тенденцию, выходя с 1, когда ни одна линия не совпадает, и 2 при фактических ошибках. Большое спасибо, Столмен.

Cecil Curry 03.01.2016 11:57

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

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

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

import errno, sys

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

Это неверно. Эти errno не предназначены для использования в качестве кодов завершения процесса. Это коды ошибок низкого уровня, предназначенные для внутреннего использования в программах, особенно написанных на языке C. Для Python по возможности используйте исключения.

SvdB 08.08.2014 21:11

Ты прав. Они предназначены для внутреннего использования. Но обычно вы не вызываете исключения на уровне конечного пользователя. Вы используете sys.exit (x), где x - целое число, которое вы выбираете произвольно. Но вы можете использовать те, которые начинаются с EX_ и определены в модуле 'os'. Как os.EX_OK или os.EX_IOERR

Oli 12.08.2014 12:50

Извините, но я также отрицательно отношусь к этому, потому что это вводит в заблуждение. Коды состояния выхода и номера ошибок нет взаимозаменяемы / дополняют друг друга. Используя данный пример, «разрешение отклонено» имеет код ошибки, равное 13 (согласно errno и errno.h), но код статуса выхода, равное 77 (согласно os и sysexits.h). Программы, которые генерируют первое, нестандартны (де-факто vel jure) и не будут хорошо работать с другими, которые справедливо ожидают второго.

Mark G. 09.01.2020 21:44

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

phoenix 09.06.2016 03:47

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

phoenix 23.07.2018 21:39

Полный пакет равен 0 в случае успеха и 1 в случае неудачи.

Pavel Minaev 10.09.2019 01:20

Если вы хотите переносно использовать стандартные коды выхода 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 вызвал ошибку ИЛИ имел синтаксическую ошибку.

Shital Shah 05.04.2020 10:11

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

Так в чем разница? Откуда эта информация? Вы имеете в виду выполнение обработчиков "при выходе" или что именно вы имеете в виду? SystemExit, похоже, поднимается в любом случае.

0xC0000022L 20.11.2017 17:53

мм, перепутал с os._exit, оба вроде SystemExit поднимают.

vidstige 20.11.2017 22:09

Неправильно: sys.exit()делает завершает работу чисто, как и exit(). Оба они выполняют функцию такой же: вызывают исключение SystemExit. На самом деле exit() предназначен для интерактивных сессий, а не для скриптов, поэтому концептуально sys.exit()является - указанный. Возможно, вы запутаетесь с os._exit(), который резко обрывается.

MestreLion 06.11.2019 01:39

Добавление к @MestreLion: exit() даже не является полностью встроенным; заклинило во встроенные постфактум при импорте модуля site. В большинстве случаев это происходит неявно, но для скриптов Python, которые пытаются работать быстро и не полагаются на сторонние модули (установленные в site-packages), их можно запустить с переключателем -S, чтобы полностью отключить импорт site, и exit() не будет существовать (sys.exit() по-прежнему будет).

ShadowRanger 02.12.2020 17:41

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.

Другие вопросы по теме