Python中如何获取模块顶层代码的code对象?
获取Python模块顶层代码的code对象
当然可以获取,但模块顶层代码的code对象不像函数那样有直接的__code__属性随时访问,得分两种场景处理:
1. 模块作为主程序正在执行时
此时可以通过栈帧直接获取顶层代码的code对象,用sys._getframe(0).f_code拿到当前顶层执行帧的code对象,示例如下:
修改你的测试文件:
import sys myvar = 1 print('hello from top level') def myfunction(): print('hello from function') # 获取顶层code对象 top_code = sys._getframe(0).f_code # 查看常量集合,能找到顶层的目标字符串 print(top_code.co_consts) # 输出会包含'hello from top level'
2. 模块已被导入,需要事后获取
模块加载完成后,顶层代码执行的栈帧已经销毁,没法直接拿到当时的code对象,但可以重新读取模块源代码,用compile()函数编译出对应的code对象:
import mymodule import inspect # 获取模块的源代码内容 source_code = inspect.getsource(mymodule) # 编译成exec模式的code对象,参数依次为源码、模块文件路径、执行模式 top_code = compile(source_code, mymodule.__file__, 'exec') # 查看常量集合 print(top_code.co_consts) # 同样能找到'hello from top level'
需要注意:第二种方法得到的是重新编译后的code对象,逻辑上和模块实际执行时的一致,但如果模块加载后源代码被修改,结果可能和实际执行时的有差异。
内容的提问来源于stack exchange,提问作者Martin Payne
相关产品推荐
相关产品推荐

