关于shell:如何将错误退出代码从python脚本传递给调用它的KSH脚本?

How to pass an error exit code from a python script to the KSH script that calls it?

我有一个由KornShell脚本调用的python脚本。如果python脚本遇到错误,korn shell脚本仍然以0退出。如何让python脚本告诉ksh它没有正确终止?

说唱脚本如下:

1
2
3
4
5
6
7
8
python2.7 python_script.py ${inargument} >> ${log_file}  2>&1

exit_code=$?                            

if [ ${exit_code} -ne 0 ]
   then
   echo"Python script failed">> ${log_file}
fi


我不确定ksh,但这就是让python返回非零返回值的方法,我假设ksh可以检测并处理这个问题。

1
2
3
4
import sys

retCode = 5
sys.exit(retCode)

1
2
retCode = -128
raise SystemExit(retCode)


我不能评论,因为声誉,但您绝对可以使用来自nephim comment的代码。

1)只需将nephim的第一个代码放入test.py。(chmod 700 test.py)

2)此ksh脚本run test.py:

1
2
3
4
5
#!/usr/bin/ksh

./test.py

exit $?

3)这是来自命令行的示例

1
2
3
> ./test.ksh
> echo $?
5

附言:你也应该做一个测试。

P.P.S:可能我误解了你的问题。如果您的python脚本在到达末尾之前退出(因此它不执行sys.exit(coderet)命令),在这种情况下,您应该使用try..execpt构造。

1
2
3
4
try :
    <some code>
except <Error to Catch>:
    sys.exit(codeRet)

正如这里所解释的:python:关于捕获任何异常,您甚至可以捕获所有异常:

1
2
3
4
try:
    do_something()
except:
    print"Caught it!"

但正如所解释的:"你可以,但你不应该"

更新:@ AlexKinman我觉得你的Python有点问题…正如三重皮提到的,它可以是包装纸吗?你能给我一份埃多克斯的退货单吗?

这里是我的测试:

$# cat wrong_test.ksh

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/ksh

log_file=log.txt

python -c 'raise Exception("foo")' >> ${log_file}  2>&1

exit_code=$?                            

if [ ${exit_code} -ne 0 ]
   then
   echo"Python script failed">> ${log_file}
fi

$# cat log.txt
Traceback (most recent call last):
File"", line 1, in
Exception: foo
Python script failed

$# cat good_test.ksh

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/ksh

log_file=log1.txt

python -c 'print"Hello"' >> ${log_file}  2>&1

exit_code=$?                            

if [ ${exit_code} -ne 0 ]
   then
   echo"Python script failed">> ${log_file}
fi

$# cat log1.txt
Hello


将整个脚本包装在一个try块中,然后在catch中将错误写入输出文件。比起在ksh中,您可以读取输出文件,并做任何您需要做的事情。

这是一些伪代码。

1
2
3
4
5
rm opFile
python yourSript.py
if opFile != blank:
   process log file...
   start cat runlog.m | more