首页 > 解决方案 > 为什么 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   

在此处输入图像描述

现在谢谢。

标签: pythonpython-3.xbytecode

解决方案


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

由于pyc文件的结构以 4 字节的编组版本号、4 字节的修改时间戳和marshal.dump方法中原始字节码的转储开始,根据 Ned Batchelder 的优秀文章,您可以使用marshal.loadpyc文件中恢复原始字节码在寻找索引 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))

推荐阅读