你好!假设我们有以下代码:
x = 10
您需要获取与其对应的字节码。
让我们尝试编译它:
from dis import dis
dis('x=10')
我们得到:
1 0 LOAD_CONST 0 (10)
2 STORE_NAME 0 (x)
4 LOAD_CONST 1 (None)
6 RETURN_VALUE
或者,像这样(几乎相同):
from dis import Bytecode
bc = Bytecode('x=10')
list(bc.codeobj.co_code)
[100, 0, 90, 0, 100, 1, 83, 0]
在最后一个字节码中,有关常量的信息丢失了,尽管有LOAD_CONST(100)。
让我们尝试编译文件compileall:
>> python -m compileall ./
Listing './'...
Compiling './set.py'...
我们得到:
00 00 00 00 00 00 00 00 00 01 00 00 00 40 00 00
00 73 08 00 00 00 64 00 5A 00 64 01 53 00 29 02
E9 0A 00 00 00 4E 29 01 DA 01 78 A9 00 72 03 00
00 00 72 03 00 00 00 FA 08 2E 2F 73 65 74 2E 70
79 DA 08 3C 6D 6F 64 75 6C 65 3E 01 00 00 00 73
00 00 00 00
我在这段代码中找不到前一个。
这怎么解释?
一般来说,在哪里可以尊重它是如何安排的.pyc?
我想为 Python 编写自己的小型 VM。
pyc 文件包括
幻数是每个解释器版本唯一的两个字节和
0d0a. 字节0d0a是回车和换行,可保护文件在文本模式下编辑时不被损坏。时间戳存储了源最后一次更改的时间,根据该时间生成pyc文件。
有了尺寸,我确信一切都是显而易见的,不需要任何澄清。
该文件的其余部分是在代码对象上运行marshal.dump的结果,而这又是编译源代码的结果。
您可以使用此脚本“反汇编”pyc 文件:
在此脚本的 pyc 文件上运行它
将给出以下输出
答案基于这篇文章。