You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行时获取意外模块对象求助:跨模块调用如何获取调用方模块

问题解决:获取调用者模块对象而非定义者模块

问题分析

你的代码中,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 20:57:02