我在test.py中编写了基本的Python代码
print("Hello World")
然后,我使用此代码进行编译并生成了.pyc文件。我现在有 .py 和 .pyc 文件。
python -m compileall
现在,我使用 dis 模块来反汇编python字节码,但是.pyc文件无法正常工作。
为什么不能 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
谢谢。
答案 0 :(得分:2)
虽然dis.dis
函数既支持源代码字符串,也支持原始字节码序列作为输入,但是dis
模块作为主程序(您使用它的方式)仅支持输入的源代码文件名。
由于pyc
文件的结构始于4字节的编组版本号,4字节的修改时间戳记和marshal.dump
方法中原始字节码的转储,因此,根据Ned Batchelder的出色著作{ {3}},您可以在寻找索引8的文件位置之后,使用marshal.load
从pyc
文件中恢复原始字节码。但是,当Ned编写此头文件时,它实际上是针对Python 2的文章。作为@OndrejK。通过引用article在注释中指出,您必须在Python 3.0和Python 3.6之间执行f.seek(16)
,而不是Python 3.7和f.seek(12)
:
import dis
import marshal
with open('a.pyc', 'rb') as f:
f.seek(16)
dis.dis(marshal.load(f))