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 之后的内容?

你看过反编译器吗? https://docs.python.org/3/library/dis.html

试试这个。它工作了一段时间。他们在 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