如何获取通过exec在函数内部动态声明的Python函数源代码?
获取exec动态生成函数的源代码解决方案
当函数通过exec在第三方模块的函数内部动态声明时,inspect.getsource无法获取其源代码——这类动态函数没有关联的源文件信息,且生成它的func_code属于第三方内部逻辑,无法直接访问。
简化示例
from inspect import getsource def declare_func(): func_code = '''def new_func(): print("Hello, world!")''' exec(func_code) return locals()['new_func'] func = declare_func() print('=run=') func() print('=func=') print(func) print('=code=') print(getsource(func))
运行输出
=run= Hello, world! =func= <function new_func at 0x000001DF77173E20> =code= ... OSError: could not get source code
解决方案
由于无法直接获取生成函数的原始字符串,只能通过反编译函数的字节码来还原源代码,推荐使用uncompyle6库:
- 安装依赖
pip install uncompyle6
- 编写获取源码的函数
import uncompyle6 from io import StringIO def get_dynamic_func_source(func): output_buffer = StringIO() # 反编译函数的字节码 uncompyle6.decompile(func.__code__, output_buffer) return output_buffer.getvalue() # 调用示例 func = declare_func() print(get_dynamic_func_source(func))
说明
- 反编译得到的代码和原始代码可能存在细微格式差异(如空格、换行),但逻辑完全一致。
- 如果不想安装第三方库,也可以用Python内置的
dis模块查看字节码,但可读性远不如反编译后的源码。
内容的提问来源于stack exchange,提问作者Yaroslav_A
相关产品推荐
相关产品推荐

