Python为什么无法反汇编此.pyc文件?

时间:2019-12-20 21:58:00

标签: python python-3.x bytecode

我在test.py中编写了基本的Python代码

print("Hello World")

然后,我使用此代码进行编译并生成了.pyc文件。我现在有 .py .pyc 文件。

python -m compileall

现在,我使用 dis 模块来反汇编python字节码,但是.pyc文件无法正常工作。

enter image description here

为什么不能 pyc字节码文件被取消,而 py文件可以在编译并生成字节码后被取消(.py->(compile)->字节码)?

我的pyc文件:

B

hAı]   ã               @   s   e d ƒ dS )zHello WorldN)Úprint© r   r   ú"C:\Users\ismet\Desktop\deneme\a.pyÚ<module>   s   

enter image description here

谢谢。

1 个答案:

答案 0 :(得分:2)

虽然dis.dis函数既支持源代码字符串,也支持原始字节码序列作为输入,但是dis模块作为主程序(您使用它的方式)仅支持输入的源代码文件名。

由于pyc文件的结构始于4字节的编组版本号,4字节的修改时间戳记和marshal.dump方法中原始字节码的转储,因此,根据Ned Batchelder的出色著作{ {3}},您可以在寻找索引8的文件位置之后,使用marshal.loadpyc文件中恢复原始字节码。但是,当Ned编写此头文件时,它实际上是针对Python 2的文章。作为@OndrejK。通过引用article在注释中指出,您必须在Python 3.0和Python 3.6之间执行f.seek(16),而不是Python 3.7和f.seek(12)

import dis
import marshal

with open('a.pyc', 'rb') as f:
    f.seek(16)
    dis.dis(marshal.load(f))