Python 字节码 (.pyc) 文件的标头以一个幻数开头,该幻数在 Python 版本之间会发生变化。我如何(以编程方式)找出当前 Python 版本的编号以生成有效的标头?我目前正在对 Python 3.7.1 进行硬编码,但这意味着我现在依赖于特定的 Python 版本。
这个答案 https://stackoverflow.com/a/8628185/149392正是我想要使用的py_compile.MAGIC
,但这在 Python 3 中似乎不再存在。我怎样才能在 Python 3 中做同样的事情呢?
这是我正在尝试做的一个例子:
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 时。我正在寻找一种为用于运行脚本的 Python 3 版本生成标头的方法,而不是硬编码 3.7。
对于上下文:
我正在将一种简单的编程语言编译为不同的字节码格式(LLVM、Java 字节码、Web Assembly 和现在的 Python 字节码),作为编译器构建计划教程系列的一部分。
我可以使用生成Python字节码字节流库 https://github.com/zachariahreed/byteasm,这给了我一个结果函数。但为了将内容写入.pyc
文件,我需要一个有效的标题。通过对标头进行硬编码,只有当学习本教程的人员运行与我相同版本的 Python 3 (3.7) 时,代码才会起作用,否则他们必须手动找出其版本的幻数。
从 Python 3.4 开始,有importlib.util.MAGIC_NUMBER https://docs.python.org/3/library/importlib.html#importlib.util.MAGIC_NUMBER在模块中importlib
:
>>> import importlib
>>> importlib.util.MAGIC_NUMBER.hex()
'420d0d0a'
Python get_magic
的方法imp
module.
>>> import imp
>>> imp.get_magic().hex()
'420d0d0a'
请注意,虽然这在 Python 3.7 中仍然有效,但自 Python 3.4 起已被弃用
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)