7

在 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。

4

3 回答 3

6

实际上,文档表明

退出状态指示:一个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。

于 2010-12-15T09:40:01.400 回答
3

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

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

编辑:显然(来自此评论),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

尽管这忽略了核心转储信息。

于 2010-12-15T09:24:20.613 回答
-3

为我工作(CentOS 5.5,Python 2.6.5):

$ python
>>> import sys
>>> sys.exit(245)
$ echo $?
245
于 2010-12-15T09:22:19.113 回答