为什么可以';t Python dis模块反汇编这个.pyc文件?
我在test.py中编写了一个基本的Python代码为什么可以';t Python dis模块反汇编这个.pyc文件?,python,python-3.x,bytecode,Python,Python 3.x,Bytecode,我在test.py中编写了一个基本的Python代码 print("Hello World") 然后,我用这段代码编译并生成了.pyc文件。我现在有.py和.pyc文件 python -m compileall 现在,我使用dis模块来反汇编python字节码,但是.pyc文件不工作,而.py文件工作 为什么pyc字节码文件不能被分解,而py文件在编译并生成字节码(.py-->(compile-->bytecode)后可以分解 我的pyc文件: B hAı] ã
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
B
hAı]ãs e dƒdS)zHello WorldN)Úprint©rúC:\Users\ismet\Desktop\deneme\a.pyÚs
现在谢谢。虽然
dis.dis
函数同时支持源代码字符串和原始字节码序列作为输入,但作为主程序的dis
模块(您使用它的方式)只支持源代码的文件名作为输入
由于pyc
文件的结构以4字节的编组版本号、4字节的修改时间戳和marshal.dump
方法中的原始字节码转储开始,因此根据Ned Batchelder的优秀做法,您可以使用marshal.load
从pyc
文件中恢复原始字节码查找索引8的文件位置。然而,Ned在撰写本文时,此标题大小实际上是针对Python 2的。正如@OndrejK.在引用注释中指出的,您必须执行f.seek(16)
,而不是Python 3.7,以及Python 3.0和Python 3.6之间的f.seek(12)
:
import dis
import marshal
with open('a.pyc', 'rb') as f:
f.seek(16)
dis.dis(marshal.load(f))
我尝试了这段代码,它给出了一个错误“ValueError:必须正好有一个create/read/write/append模式,最多一个加上”我使用了'r+b'而不是'b'和response:I猜想,response is worn:/实际上这也可能取决于使用的python版本……请参见。因此,在我的例子(py3.7)中,我需要
seek()
4*4
->16
字节以通过标题并解组code
对象。是的,完成了。seek(16)工作,但seek(8)不工作。非常感谢♥它确实是字节,但它们是一个字节码序列,由解释器执行,不可直接读取。如果需要,您可以使用该类手动解释它。如果您编写自己的解释器来执行它,您也可以运行它,但这也使您的代码成为虚拟机,因此,是的,该字节码必须由v执行虚拟机器。