Question

J'essaie de décoder le résultat de la fonction Python os.wait().Cela renvoie, selon la documentation Python :

un tuple contenant son pid et son indication d'état de sortie :un nombre de 16 bits, dont l'octet de poids faible est le numéro du signal qui a arrêté le processus, et dont l'octet de poids fort est l'état de sortie (si le numéro de signal est zéro) ;le bit haut de l'octet faible est défini si un fichier core a été produit.

Comment décoder l’indication d’état de sortie (qui est un entier) pour obtenir les octets haut et bas ?Pour être plus précis, comment implémenter la fonction de décodage utilisée dans l'extrait de code suivant :

(pid,status) = os.wait()
(exitstatus, signum) = decode(status) 
Était-ce utile?

La solution

Cela fera ce que vous voulez :

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

Autres conseils

Pour répondre à votre question générale, vous pouvez utiliser manipulation de bits Techniques :

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

Cependant, il existe également fonctions intégrées pour interpréter les valeurs du statut de sortie :

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

Voir également:

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

Vous pouvez diviser votre int en une chaîne d'octets non signés avec le structurer module:

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)

Si vous associez cela avec le tableau module, vous pouvez le faire plus facilement :

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)

Vous pouvez décompresser le statut en utilisant décalage de bits et masquage les opérateurs.

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

Je ne suis pas un programmeur Python, j'espère donc que la syntaxe est correcte.

Les gens avant moi l'ont compris, mais si vous le voulez vraiment sur une seule ligne, vous pouvez faire ceci :

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

MODIFIER:Je l'avais à l'envers.

import amp as amp
import status
signum = status &amp; 0xff
exitstatus = (status &amp; 0xff00) &gt;&gt; 8
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top