运行时获取意外模块对象求助:跨模块调用如何获取调用方模块
问题解决:获取调用者模块对象而非定义者模块
问题分析
你的代码中,inspect.currentframe()获取的是get_module_object函数执行时所在的栈帧,这个帧属于mod1模块,所以inspect.getmodule()自然返回mod1。要拿到调用者(比如mod2)的模块,需要获取调用该函数的上层栈帧。
解决方案
修改mod1.py中的函数,获取当前帧的上一级帧(即调用者的帧),再通过这个帧获取模块对象:
# mod1.py import inspect def get_module_object(): # 获取当前函数的栈帧,然后取它的上一级(调用者的帧) caller_frame = inspect.currentframe().f_back return inspect.getmodule(caller_frame)
验证效果
在mod2.py中调用:
# mod2.py from mod1 import get_module_object print(get_module_object()) # 现在返回: <module 'mod2' from '...\mod2.py'>
原理说明
inspect.currentframe():返回当前函数执行时的栈帧对象.f_back:栈帧对象的属性,指向调用当前函数的上一级栈帧(也就是调用者代码所在的帧)- 基于调用者的栈帧获取模块,就能得到调用方(
mod2/mod_n)的模块对象,完全封装在mod1中,调用方无需额外导入inspect或传参。
关于__file__类似问题的补充
模块级别的__file__是在模块加载时确定的,属于定义它的模块。而通过栈帧获取的是运行时调用上下文,所以能准确拿到调用者模块的相关信息,完美解决这类"上下文错位"问题。
内容的提问来源于stack exchange,提问作者baskettaz
相关产品推荐
相关产品推荐

