Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';t Python dis模块反汇编这个.pyc文件?_Python_Python 3.x_Bytecode - Fatal编程技术网

为什么可以';t Python dis模块反汇编这个.pyc文件?

为什么可以';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ı] ã

我在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   
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执行虚拟机器。