如何在python中绕过sys.exit()的0-255范围限制?

时间:2010-12-15 09:16:29

标签: python linux exit-code

在python中(在Linux系统上),我使用os.system()启动命令并检索返回码。如果返回代码不同于0,我想使用相同的返回代码退出程序。所以我写道:

ret = os.system(cmd)
if ret != 0:
   print "exit with status %s" % ret
   sys.exit(ret)

当返回代码低于256时,它工作正常,但是当它大于255时,使用的退出代码是0.如何使sys.exit()接受大于255的代码?

编辑:限制实际为255

实际上,ret变量接收256,但sys.exit()无法使用它,因此程序返回0。当我手动启动cmd时,我看到它返回1而不是256。

3 个答案:

答案 0 :(得分:6)

实际上,documentation表示

  

退出状态指示:一个16位数字,其低字节是杀死进程的信号编号,其高字节是退出状态(如果信号编号为零);如果生成了核心文件,则设置低字节的高位。

所以我需要处理sys.exit()返回的数字,以便检索真正的退出状态,如下所示:

ret = os.system(cmd)
# Ignore the first byte, use the second one only
ret = ret >> 8
if ret != 0:
   print "exit with status %s" % ret
   sys.exit(ret)

现在它可以工作:ret包含1而不是256。

答案 1 :(得分:3)

不能不应该,因为系统为自己保留128以上的退出代码。如果返回码为0到127,则表示程序自行退出。如果返回码高于128,则意味着程序被系统信号(例如SIGKILL或SIGTERM)终止。信号编号是结果代码减去128。

我认为你需要检测它并做出其他类型的输出指示。也许将返回代码打印到STDOUT,然后返回0(正常退出,正常输出)或1(cmd有一个非零返回值,输出意味着什么)。

编辑:显然(来自this comment),Python比shell脚本更聪明......要把它放回常规的Linux退出代码中,试试这个:

subprocess_exit_code = (ret >> 8) & 0x7f
subprocess_signal_number = ret & 0xff

if subpprocess_signal_number == 0:
  exit_code = subprocess_exit_code
else:
  exit_code = 128 + subprocess_signal_number

虽然这会忽略核心转储信息。

答案 2 :(得分:-1)

适合我(CentOS 5.5,Python 2.6.5):

$ python
>>> import sys
>>> sys.exit(245)
$ echo $?
245