Получите код статуса выхода из Python, например 0 или 1

У меня есть сценарий Python, который выполнит некоторые действия и в зависимости от результата выйдет с кодом 0 (хорошо) или 1 (плохо).

Я хочу получить этот результат, сохранить его в переменной и отправить по UDP. Это невозможно сделать внутри скрипта Python (требование).

Допустим, мой сценарий выглядит примерно так:

import sys
# Do some stuff
sys.exit(0) # or sys.exit(1)

Который я запускаю с python script.py.

Как я могу получить этот код статуса выхода (0 или 1)?

Я пытаюсь повторить эхо $errorlevel, но выводится только пустая строка. Я также пытаюсь использовать exit(0) вместо sys.exit() (см. здесь) и некоторые другие безуспешные попытки.


person Mornor    schedule 14.09.2016    source источник
comment
sys.exit(0) - это правильный способ отправить код возврата в вашу оболочку. Но вы не сказали, какую ОС или оболочку вы используете. В bash и подобных оболочках $? имеет код выхода последней команды.   -  person PM 2Ring    schedule 14.09.2016
comment
Который я запускаю с python script.sh *., Разве вы не имели в виду То, что я запускаю с python script.py?   -  person Laurent LAPORTE    schedule 14.09.2016
comment
Да, извините за .py   -  person Mornor    schedule 14.09.2016
comment
Это действительно вопрос о Python? Насколько я могу судить, вы спрашиваете, как записать код выхода процесса (в данном случае это Python), но это может быть любой процесс. Как упоминает @ PM2Ring - это зависит от вашей оболочки / среды и т. Д.   -  person Jon Clements♦    schedule 14.09.2016
comment
@ PM2Ring Я использую MacOS.   -  person Mornor    schedule 14.09.2016
comment
Это должно работать на Posix: _1 _ = ›1   -  person Laurent LAPORTE    schedule 14.09.2016
comment
Это не вопрос о питоне как таковом. это вопрос о вашей оболочке. Какой вы используете? Баш, ш, рыба, ...? в bash вы фиксируете последний код выхода с помощью $?. Как вы отправляете захваченные переменные?   -  person RedX    schedule 14.09.2016


Ответы (3)


Поскольку согласно вашему ответу вы используете zsh

test.py

import sys
sys.exit(12)

в твоей консоли

python test.py
RC=$?
echo "Exit code $RC"
program_to_send $RC
person RedX    schedule 14.09.2016
comment
Я не совсем понимаю идею строк 2 и 3 - почему бы просто не echo $? напрямую? - person CutePoison; 15.01.2019
comment
@Jakob echo установит собственный код выхода, и второй вызов будет использовать его вместо исходного. Поэтому, чтобы сделать их последовательными, я сохраняю возврат и использую его в обоих местах. - person RedX; 15.01.2019
comment
когда я это делаю (без RC = $?), он возвращает правильные значения - 0, если все в порядке, но когда я вызываю ошибку в файле .py, он возвращает 1 - person CutePoison; 15.01.2019
comment
@Jakob Пожалуйста, отправьте новый вопрос, чтобы мы могли обсудить его там должным образом. - person RedX; 15.01.2019

Это вопрос сценария, а не вопрос Python, но в оболочке Bash вы используете $?, и, поскольку любая команда изменяет $?, обычно рекомендуется сохранить копию.

python script.py
RC=$?

echo $RC
[ $RC == 0 ] && echo Success || echo Failed
# Replace above lines by whatever you need to send $RC via UDP ...

Если это вопрос сценария Windows CMD, вам, вероятно, следует сделать репост с соответствующими тегами. (Я больше не занимаюсь Windows, спасибо ‹deity›.)

person nigel222    schedule 14.09.2016
comment
Если используется shell, последняя строка должна быть изменена на [ $RC==0 ] && .... - person ThomasGuenet; 29.10.2018

Это должно быть сделано правильно, перехватывая исключения и используя регистратор.

import logging, time

logging.basicConfig(level=logging.DEBUG, filename='/path/to/file/errorlog.log')

try:
    #MySQL Connection
except MySQLdb.Error as e:
    errortime = time.strftime('%Y-%m-%dT%H:%M:%S')
    logging.exception(errortime)
    raise os._exit(0)
person user6831097    schedule 14.09.2016