我一直在使用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/

10-12 18:50