我正在尝试解码Python os.wait()函数的结果。根据Python文档,这将返回:
包含其pid和退出状态指示的元组:一个16位数字,其低字节是杀死进程的信号编号,其高字节是退出状态(如果信号编号为零);如果生成了核心文件,则设置低字节的高位。
如何解码退出状态指示(这是一个整数)以获得高字节和低字节?具体来说,我如何实现以下代码片段中使用的解码函数:
(pid,status) = os.wait()
(exitstatus, signum) = decode(status)
答案 0 :(得分:12)
要回答您的一般问题,您可以使用bit manipulation技术:
pid, status = os.wait()
exitstatus, signum = status & 0xFF, (status & 0xFF00) >> 8
但是,还有built-in functions用于解释退出状态值:
pid, status = os.wait()
exitstatus, signum = os.WEXITSTATUS( status ), os.WTERMSIG( status )
另见:
答案 1 :(得分:11)
这将做你想要的:
signum = status & 0xff
exitstatus = (status & 0xff00) >> 8
答案 2 :(得分:2)
您可以使用struct模块将您的int分解为一串无符号字节:
import struct
i = 3235830701 # 0xC0DEDBAD
s = struct.pack(">L", i) # ">" = Big-endian, "<" = Little-endian
print s # '\xc0\xde\xdb\xad'
print s[0] # '\xc0'
print ord(s[0]) # 192 (which is 0xC0)
如果您将其与array模块结合使用,您可以更方便地执行此操作:
import struct
i = 3235830701 # 0xC0DEDBAD
s = struct.pack(">L", i) # ">" = Big-endian, "<" = Little-endian
import array
a = array.array("B") # B: Unsigned bytes
a.fromstring(s)
print a # array('B', [192, 222, 219, 173])
答案 3 :(得分:2)
exitstatus, signum= divmod(status, 256)
答案 4 :(得分:1)
您可以使用bit-shifting和masking运算符解压缩状态。
low = status & 0x00FF
high = (status & 0xFF00) >> 8
我不是Python程序员,所以我希望语法正确。
答案 5 :(得分:0)
我之前的人已经钉了它,但是如果你真的想要它在一条线上,你可以这样做:
(signum, exitstatus) = (status & 0xFF, (status >> 8) & 0xFF)
编辑:让它倒退。
答案 6 :(得分:0)
import amp as amp
import status
signum = status & 0xff
exitstatus = (status & 0xff00) >> 8