我一直在使用dis
库来分解一些Python源代码,但是我发现这并没有递归到函数或类中:
import dis
source_py = "test.py"
with open(source_py) as f_source:
source_code = f_source.read()
byte_code = compile(source_code, source_py, "exec")
dis.dis(byte_code)
我所看到的都是条目,例如:
54 456 LOAD_CONST 63 (<code object foo at 022C9458, file "test.py", line 54>)
459 MAKE_FUNCTION 0
462 STORE_NAME 20 (foo)
如果源文件具有功能
foo()
,我显然可以在源文件中添加以下内容:dis.dis(foo)
我无法弄清楚如何在不更改源文件并执行的情况下执行此操作。我希望能够从已编译的
byte_code
中提取相关的字节,并将它们传递给dis.dis()
。def sub_byte_code(byte_code, function_or_class_name):
sub_byte_code = xxxxxx
dis.dis(sub_byte_code)
我考虑过如下包装源代码并执行
dis.dis()
,但是我不希望执行脚本:source_code_dis = "import dis\n%s\ndis.dis(foo)\n" % (source_code)
exec(source_code_dis)
调用它可能有技巧吗?例如
dis.dis(byte_code, recurse=True)
最佳答案
将文件导入为模块,然后在该模块上调用dis.dis()
。
import dis
import test
dis.dis(test)
您也可以从命令行执行此操作:
python -m dis test.py
引用documentation for
dis.dis
:编辑:从python 3.7开始,
dis.dis
是递归的。关于python - 如何完全反汇编Python源代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31989893/