Hoe kan ek 'n heelgetal as 'n verskeidenheid van grepe in Python behandel?

StackOverflow https://stackoverflow.com/questions/10123

  •  08-06-2019
  •  | 
  •  

Vra

Ek probeer om die gevolg van die funksie Python os.wait () te ontsyfer. Hierdie keer terug, volgens die Python dokumente:

  

'n tuple met sy pid en uitgang status aanduiding: 'n 16-bit nommer, wie se lae byte is die sein nommer wat die proses gedood, en wie se hoë byte is die uitgang status (indien die sein nommer is nul); die hoë bietjie van die lae byte is ingestel as 'n kern lêer is vervaardig.

Hoe kan ek ontsyfer die uitgang status aanduiding (wat 'n heelgetal) aan die hoë en lae byte kry? Om spesifiek te wees, hoe implementeer ek die dekodeer funksie gebruik in die volgende kode uit:

(pid,status) = os.wait()
(exitstatus, signum) = decode(status) 
Was dit nuttig?

Oplossing

Dit sal doen wat jy wil:

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

Ander wenke

Om jou algemene vraag te beantwoord, kan jy bietjie manipulasie tegnieke gebruik:

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

Daar is egter ook ingeboude funksies vir die interpretasie van die uitgang status waardes:

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

Sien ook:

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

Jy kan kry breek jou int in 'n string van unsigned grepe met die struct 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)

As jy koppel dit met die verskeidenheid module kan u hierdie meer gerieflik te doen:

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)

Jy kan die status pak met behulp -bit verskuiwing en maskering operateurs.

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

Ek is nie 'n Python programmeerder, so ek hoop het die sintaksis korrek is.

Die mense voor me've vasgespyker dit, maar as jy regtig wil dit op een lyn, kan jy dit doen:

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

EDIT:. Het dit agteruit

import amp as amp
import status
signum = status &amp; 0xff
exitstatus = (status &amp; 0xff00) &gt;&gt; 8
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top