我在 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.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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句