我一直在玩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)