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

Why can't Python dis module disassembly this .pyc file?

我在 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 的优秀 article, you can use marshal.load to restore the raw bytecode from the the pyc file after seeking the file position of index 8. However, this header size was really meant for Python 2 when Ned wrote the article. As @OndrejK. points out in the comment by referencing PEP-552,你必须执行 f.seek(16) 而不是 Python 3.7,并且 f.seek(12) 在 Python 3.0 和 Python 3.6 之间:

import dis
import marshal

with open('a.pyc', 'rb') as f:
    f.seek(16)
    dis.dis(marshal.load(f))