python - 为什么 Python dis module 不能反汇编这个 .pyc 文件?
问题描述
我在 test.py 中写了一个基本的 Python 代码
print("Hello World")
然后,我用这段代码编译并生成了 .pyc 文件。我现在有.py和.pyc文件。
python -m compileall
现在,我使用dis模块来反汇编 python 字节码,但是 .pyc 文件在 .py 文件工作时不起作用。
为什么pyc 字节码文件不能被反序列化,而py 文件在编译和生成字节码后可以被反序列化(.py -->(编译) --> 字节码)?
我的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 的优秀文章,您可以使用marshal.load
从pyc
文件中恢复原始字节码在寻找索引 8 的文件位置之后。然而,当 Ned 写这篇文章时,这个标题大小实际上是为 Python 2 设计的。作为@OndrejK。通过引用PEP-552在评论中指出,f.seek(16)
从 Python 3.7 开始,以及f.seek(12)
在 Python 3.0 和 Python 3.6 之间,您必须改为执行 a :
import dis
import marshal
with open('a.pyc', 'rb') as f:
f.seek(16)
dis.dis(marshal.load(f))