Python bytecode (.pyc)文件有一个头文件,它以一个魔术数字开头,不同的Python版本会有所不同。我如何(以编程方式)找到当前Python版本的编号,以便生成有效的头文件?我目前正在对Python 3.7.1版本进行硬编码,但这意味着我现在依赖于特定的Python版本。
使用py_compile.MAGIC
,This answer可以做我想做的事情,但是在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!“。它确实如此,但仅当使用Python 3.7时。我正在寻找一种方法,无论使用哪个版本的Python3来运行脚本,都可以生成头部,而不是硬编码3.7。
对于上下文:
我正在将一种简单的编程语言编译成不同的字节码格式(LLVM、Java字节码、Web Assembly和现在的Python字节码),这是计划中的编译器构建教程系列的一部分。
我可以使用the byteasm library生成Python字节码,这将为我提供一个函数。但是为了将内容写入.pyc
文件,我需要一个有效的头文件。通过对头文件进行硬编码,只有当学习本教程的人运行与我相同的Python3版本(3.7)时,代码才能正常工作,否则他们就必须手动找出他们版本的魔术数字。
发布于 2018-12-18 13:04:20
在Python3.4中,模块importlib
中有importlib.util.MAGIC_NUMBER
>>> import importlib
>>> importlib.util.MAGIC_NUMBER.hex()
'420d0d0a'
Python3.4或Python2的另一个解决方案是get_magic
method of the imp
module。
>>> import imp
>>> imp.get_magic().hex()
'420d0d0a'
请注意,虽然此功能在Python 3.7中仍然有效,但从Python 3.4开始已弃用此功能
https://stackoverflow.com/questions/53833455
复制