为什么 Python dis 模块不能反汇编这个 .pyc 文件?

梅赛德斯

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

print("Hello World")

然后,我用这段代码编译并生成了 .pyc 文件。我现在有.py.pyc文件。

python -m compileall

现在,我使用dis模块来反汇编 python 字节码,但是 .pyc 文件在 .py 文件工作时不起作用。

在此处输入图片说明

为什么pyc字节码文件不能反编译,py文件编译后可以反编译,生成字节码(.py -->(compile) --> bytecode)?

我的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.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))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章