Python错误代码被提升

arc*_*oon 6 python

考虑一个python脚本error.py

import sys
sys.exit(3)
Run Code Online (Sandbox Code Playgroud)

调用

python error.py; echo $?
Run Code Online (Sandbox Code Playgroud)

产生预期的"3".但是,请考虑runner.py

import os
result = os.system("python error.py")
print result
Run Code Online (Sandbox Code Playgroud)

收益768.似乎某种程度上python代码的结果已经被8个移位,但这两种情况如何不同并不清楚.这是怎么回事?

这发生在python 2.5和2.6中.

cod*_*ape 7

来自文档:

在Unix上,返回值是以wait()指定的格式编码的进程的退出状态.请注意,POSIX未指定C system()函数的返回值的含义,因此Python函数的返回值取决于系统.

os.wait()

等待子进程完成,并返回一个包含其pid和退出状态指示的元组:一个16位数字,其低字节是杀死进程的信号编号,其高字节是退出状态(如果是信号)数字为零); 如果生成核心文件,则设置低字节的高位.

在您的情况下,二进制的返回值768是00000011 00000000.高字节为3.


lun*_*chs 5

文件

os.system()

在Unix上,返回值是以wait()指定的格式编码的进程的退出状态

os.wait()

一个16位数字,其低字节是杀死进程的信号编号,其高字节是退出状态(如果信号编号为零)


768的高/低字节

00000011 00000000
 status   signal
Run Code Online (Sandbox Code Playgroud)

具体代码

>> 8结果应该是安全的,以获得您的实际退出状态(system()然而,跨平台的结果不是很容易).

import os
result = os.system("python error.py")
print result >> 8
Run Code Online (Sandbox Code Playgroud)