gpt4 book ai didi

python - 如何在 Python 3 中找出 .pyc header 的魔数(Magic Number)

转载 作者:太空狗 更新时间:2023-10-29 17:43:42 26 4
gpt4 key购买 nike

Python 字节码 (.pyc) 文件的 header 以随 Python 版本变化的魔数(Magic Number)开头。我如何(以编程方式)找出当前 Python 版本的编号以生成有效的 header ?我目前正在为 Python 3.7.1 硬编码,但这意味着我现在依赖于特定的 Python 版本。

This answer使用 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 版本生成 header ,而不是硬编码 3.7。

对于上下文:

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

我可以使用 the byteasm library 生成 Python 字节码,结果给了我一个函数。但是为了将内容写入 .pyc 文件,我需要一个有效的 header 。通过对 header 进行硬编码,代码仅在学习本教程的人运行的 Python 3 版本与我相同 (3.7) 时才有效,否则他们必须手动找出其版本的魔数(Magic Number)。

最佳答案

从 Python 3.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'

请注意,虽然这在 Python 3.7 中仍然有效,但自 Python 3.4 起已弃用

关于python - 如何在 Python 3 中找出 .pyc header 的魔数(Magic Number),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53833455/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com