Python 3字节码格式
Python 3 bytecode format
我想读取 .pyc
文件。但是,我找不到关于该格式的任何文档。
only one I found 不适用于 Python 3(尽管它适用于 Python 2):
>>> f = open('__pycache__/foo.cpython-34.pyc', 'rb')
>>> f.read(4)
b'\xee\x0c\r\n'
>>> f.read(4)
b'\xf8\x17\x08W'
>>> marshal.load(f)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: bad marshal data (unknown type code)
marshal 只消耗一个字节:\x00
,这确实不是 marshall 的有效第一个字符(作为比较,Python2 字节码的第一个字节对于同一个空模块是 c
)
那么,我如何解码 header 之后的内容?
试试这个。它工作了一段时间。他们在 v3.
中添加了另一个 int32
def load_file(self, source):
if isinstance(source, str):
import os.path
if not os.path.exists(source):
raise IOError("Cannot load_file('"
+ source
+ "'): does not exist")
with open(source, "rb") as fh:
header_bytes = fh.read(12)
# ignore header
self.code = marshal.load(fh)
return self.code
我想读取 .pyc
文件。但是,我找不到关于该格式的任何文档。
only one I found 不适用于 Python 3(尽管它适用于 Python 2):
>>> f = open('__pycache__/foo.cpython-34.pyc', 'rb')
>>> f.read(4)
b'\xee\x0c\r\n'
>>> f.read(4)
b'\xf8\x17\x08W'
>>> marshal.load(f)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: bad marshal data (unknown type code)
marshal 只消耗一个字节:\x00
,这确实不是 marshall 的有效第一个字符(作为比较,Python2 字节码的第一个字节对于同一个空模块是 c
)
那么,我如何解码 header 之后的内容?
试试这个。它工作了一段时间。他们在 v3.
中添加了另一个 int32def load_file(self, source):
if isinstance(source, str):
import os.path
if not os.path.exists(source):
raise IOError("Cannot load_file('"
+ source
+ "'): does not exist")
with open(source, "rb") as fh:
header_bytes = fh.read(12)
# ignore header
self.code = marshal.load(fh)
return self.code