Frage

Ich bin versucht zu decodieren, das Ergebnis des Python-os.wait () - Funktion.Das gibt, nach der Python-Dokumentation:

ein Tupel enthält die pid-und exit-status Anzeige:ein 16-bit-Zahl, deren low-byte ist das signal-Nummer, die getöteten, die den Prozess und deren high-byte der exit-status (wenn die Signalnummer null ist);das höchste bit des low-byte wird gesetzt, wenn eine core-Datei erzeugt wurde.

Wie kann ich entschlüsseln, den exit-status-Anzeige (eine Ganzzahl), um den high-und low-byte?Um genau zu sein, wie implementiere ich die decode-Funktion verwendet, die im folgenden code-snippet:

(pid,status) = os.wait()
(exitstatus, signum) = decode(status) 
War es hilfreich?

Lösung

Dies wird tun, was Sie wollen:

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

Andere Tipps

Um die Antwort auf Ihre Allgemeine Frage, können Sie mit bit-manipulation Techniken:

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

Es gibt jedoch auch gebaut-in Funktionen für die Interpretation der exit-status Werte:

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

Siehe auch:

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

Sie können erhalten Ihre Pause int in einen string unsigned bytes mit den struct Modul:

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)

Wenn Sie dieses paar mit der array Modul, Sie können dies tun, mehr bequem:

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)

Sie können entpacken Sie die status mit bit-Verschiebung und Maskierung Betreiber.

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

Ich bin kein Python-Programmierer, also ich hoffe ich habe die syntax korrekt ist.

Die Leute vor mir haben es genagelt, aber wenn Sie wirklich wollen, dass es auf einer Linie, können Sie dies tun:

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

EDIT:Hatte Sie ihn nach hinten.

import amp as amp
import status
signum = status &amp; 0xff
exitstatus = (status &amp; 0xff00) &gt;&gt; 8
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top