代码之家  ›  专栏  ›  技术社区  ›  sepp2k

如何在Python3中找到.pyc头的神奇数字

  •  12
  • sepp2k  · 技术社区  · 7 年前

    Python字节码(.pyc)文件的头以一个在Python版本之间变化的神奇数字开头。我如何(以编程方式)找到当前Python版本的数字,以便生成有效的头?我目前正在为Python 3.7.1硬编码,但这意味着我现在依赖于特定的Python版本。

    This answer 这正是我想要的 py_compile.MAGIC

    下面是我尝试做的一个例子:

    import dis
    import marshal
    
    PYC_HEADER = b'\x42\x0d\x0d\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
    
    def f():
        print('Hello World')
    
    with open('test.pyc', 'wb') as pyc:
        pyc.write(PYC_HEADER)
        marshal.dump(dis.Bytecode(f).codeobj, pyc)
    

    这将创建一个文件 test.pyc

    上下文:

    我可以使用 the byteasm library ,这给了我一个函数作为结果。但是为了把内容写到 .pyc 文件,我需要一个有效的头。通过硬编码标题,只有在遵循教程的人运行与我相同的Python 3版本(3.7)或者他们必须手动查找其版本的神奇数字时,代码才会起作用。

    2 回复  |  直到 7 年前
        1
  •  14
  •   Dan D.    7 年前

    从Python3.4开始,有 importlib.util.MAGIC_NUMBER 在模块中 importlib :

    >>> import importlib
    >>> importlib.util.MAGIC_NUMBER.hex()
    '420d0d0a'
    

    Python的另一个解决方案<3.4或Python2是 get_magic method of the imp module .

    >>> import imp
    >>> imp.get_magic().hex()
    '420d0d0a'
    

    请注意,虽然这在Python3.7中仍然有效,但由于Python3.4,它已被弃用

        2
  •  8
  •   Josh Lee ZZ Coder    7 年前

    1

    >>> import importlib.util
    >>> importlib.util.MAGIC_NUMBER
    b'3\r\r\n'
    

    New in version 3.4.

    py_compile .