15

我正在尝试解码 Python os.wait() 函数的结果。根据 Python 文档,这将返回:

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

如何解码退出状态指示(整数)以获得高字节和低字节?具体来说,如何实现以下代码片段中使用的解码功能:

(pid,status) = os.wait()
(exitstatus, signum) = decode(status) 
4

7 回答 7

14

这将做你想要的:

signum = status & 0xff
exitstatus = (status & 0xff00) >> 8
于 2008-08-13T17:56:34.167 回答
12

要回答您的一般问题,您可以使用位操作

pid, status = os.wait()
exitstatus, signum = status & 0xFF, (status & 0xFF00) >> 8

但是,也有用于解释退出状态值的内置函数:

pid, status = os.wait()
exitstatus, signum = os.WEXITSTATUS( status ), os.WTERMSIG( status )

也可以看看:

  • os.WCOREDUMP()
  • os.WIFCONTINUED()
  • os.WIFSTOPPED()
  • os.WIFSIGNALED()
  • os.WIFEXITED()
  • os.WSTOPSIG()
于 2008-08-13T18:52:36.270 回答
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)

如果将它与数组模块结合使用,则可以更方便地执行此操作:

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])
于 2009-03-26T14:52:42.200 回答
2
exitstatus, signum= divmod(status, 256)
于 2009-03-26T23:48:20.277 回答
1

您可以使用位移掩码运算符解压缩状态。

low = status & 0x00FF
high = (status & 0xFF00) >> 8

我不是 Python 程序员,所以我希望语法正确。

于 2008-08-13T17:58:27.563 回答
0

我之前的人已经搞定了,但如果你真的想把它放在一条线上,你可以这样做:

(signum, exitstatus) = (status & 0xFF, (status >> 8) & 0xFF)

编辑:倒过来了。

于 2008-08-13T18:14:10.947 回答
0
import amp as amp
import status
signum = status &amp; 0xff
exitstatus = (status &amp; 0xff00) &gt;&gt; 8
于 2018-04-28T07:50:13.887 回答