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

如何在Python3中找到.pyc头的神奇数字,python,python-3.x,pyc,Python,Python 3.x,Pyc,Python字节码(.pyc)文件的头以一个在Python版本之间变化的神奇数字开头。我如何(以编程方式)找到当前Python版本的数字,以便生成有效的头?我目前正在为Python 3.7.1硬编码,但这意味着我现在依赖于特定的Python版本 使用py_compile.MAGIC实现了我想要的功能,但在Python3中似乎不再存在这种功能。如何在Python3中实现等效功能 下面是我尝试做的一个例子: import dis import marshal PYC_HEADER = b'\x42

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

使用
py_compile.MAGIC
实现了我想要的功能,但在Python3中似乎不再存在这种功能。如何在Python3中实现等效功能

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

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
,然后可以使用与脚本相同的Python解释器运行该文件,并打印“Hello World!”。确实如此,但只有在使用Python3.7时。我正在寻找一种为运行脚本所使用的Python 3的任何版本生成头的方法,而不是硬编码3.7

上下文:

我正在将一种简单的编程语言编译成不同的字节码格式(LLVM、Java字节码、Web汇编和现在的Python字节码),这是计划中的编译器构造系列教程的一部分


我可以使用生成Python字节码,这给了我一个函数。但是为了将内容写入
.pyc
文件,我需要一个有效的头。通过对标题进行硬编码,仅当遵循教程的人员运行的是与我相同的Python 3版本(3.7)或者他们必须手动查找其版本的神奇数字时,代码才会起作用。

从Python 3.4开始,模块
importlib

>>> import importlib
>>> importlib.util.MAGIC_NUMBER.hex()
'420d0d0a'
Python<3.4或Python2的另一个解决方案是

请注意,虽然这在Python 3.7中仍然有效,但由于Python 3.4移动了,它已被弃用


也许用try/except将其包装为最简单的方法是返回到
py\u compile

谢谢,这正是我所需要的(减去
.hex()
,因为它应该以字节而不是十六进制字符串的形式进入文件)。我想你的意思是“try/except”而不是“try/catch”;)哈,太多了,怎么样了。我真的很想看看你的教程系列,但我不太确定在哪里可以找到它。你能给我一个链接吗?谢谢friend@Glubs很抱歉,我从来没有抽出时间来写这封信。您可以查看字节码生成器的代码,但请注意,几乎没有任何注释,因为我认为没有必要,因为我会在我从未撰写过的博客中解释代码。
>>> import imp
>>> imp.get_magic().hex()
'420d0d0a'
>>> import importlib.util
>>> importlib.util.MAGIC_NUMBER
b'3\r\r\n'