我在test.py中编写了基本的Python代码
print("Hello World")
然后,我使用此代码进行编译并生成了.pyc文件。我现在有。py和。pyc文件。
python -m compileall
现在,我将dis模块用于反汇编python字节码,但是.pyc文件无法工作,而.py文件却可以工作。
为什么不能删除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
谢谢。
虽然dis.dis
函数同时支持源代码字符串和原始字节码序列作为输入,但是dis
模块作为主程序(这是您使用的方式)仅支持源文件名代码作为输入。
由于pyc
文件的结构以4个字节的编组版本号,4个字节的修改时间戳记以及marshal.dump
方法中的原始字节码转储开始,所以根据Ned Batchelder的出色article,您可以在查找索引8的文件位置后,请使用marshal.load
从pyc
文件中还原原始字节码。但是,当Ned撰写本文时,此标头大小的确对Python 2有意义。作为@OndrejK。通过引用PEP-552在注释中指出,从Python 3.7以及Python 3.0和Python 3.6之间的f.seek(16)
开始,您将必须执行f.seek(12)
:
import dis
import marshal
with open('a.pyc', 'rb') as f:
f.seek(16)
dis.dis(marshal.load(f))