Pergunta

Estou tentando decodificar o resultado da função Python os.wait().Isso retorna, de acordo com a documentação do Python:

uma tupla contendo seu pid e indicação de status de saída:um número de 16 bits, cujo byte inferior é o número do sinal que encerrou o processo e cujo byte superior é o status de saída (se o número do sinal for zero);o bit alto do byte baixo é definido se um arquivo principal foi produzido.

Como decodifico a indicação do status de saída (que é um número inteiro) para obter o byte alto e baixo?Para ser mais específico, como implemento a função de decodificação usada no seguinte trecho de código:

(pid,status) = os.wait()
(exitstatus, signum) = decode(status) 
Foi útil?

Solução

Isso fará o que você deseja:

signum = status & 0xff
exitstatus = (status & 0xff00) >> 8

Outras dicas

Para responder à sua pergunta geral, você pode usar manipulação de bits técnicas:

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

No entanto, também existem funções integradas para interpretar valores de status de saída:

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

Veja também:

  • os.WCOREDUMP()
  • os.WIFCONTINUADO()
  • os.WIFSTOPPED()
  • os.WIFSIGNALED()
  • os.WIFEXITED()
  • os.WSTOPSIG()

Você pode quebrar seu int em uma sequência de bytes não assinados com o estrutura módulo:

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)

Se você juntar isso com o variedade módulo você pode fazer isso de forma mais conveniente:

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])
exitstatus, signum= divmod(status, 256)

Você pode descompactar o status usando mudança de bits e mascarar operadores.

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

Não sou um programador Python, então espero que a sintaxe esteja correta.

O pessoal antes de mim acertou em cheio, mas se você realmente quiser em uma linha, pode fazer o seguinte:

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

EDITAR:Estava ao contrário.

import amp as amp
import status
signum = status &amp; 0xff
exitstatus = (status &amp; 0xff00) &gt;&gt; 8
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top