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

Python如何判断导入当前脚本的模块?实现特定条件导入

如何判断Python脚本的导入源并按需执行导入操作

__name__ 属性只能获取当前模块的名称,无法直接得知导入它的模块信息。要实现你需要的逻辑,可以通过 inspect 模块分析调用栈,定位导入当前模块的上层模块或脚本。

具体实现步骤

在 detector.py 中加入以下代码:

import inspect

def get_caller_details():
    # 获取调用栈,跳过当前函数和当前模块的栈帧
    stack_frames = inspect.stack()
    for frame_info in stack_frames[1:]:
        frame = frame_info.frame
        caller_module = inspect.getmodule(frame)
        if not caller_module:
            continue
        # 排除当前模块自身的调用
        if caller_module.__name__ == __name__:
            continue
        # 返回调用者的模块名和脚本文件名
        return caller_module.__name__, frame.f_code.co_filename
    return None, None

# 获取导入者信息
caller_mod_name, caller_file_name = get_caller_details()

# 判断是否由experiment.py/experiment模块导入
if (caller_mod_name == "experiment" 
    or (caller_file_name and caller_file_name.endswith("experiment.py"))):
    # 仅在符合条件时导入Vimba
    import Vimba
    # 这里可以添加Vimba的初始化代码
else:
    # 其他导入场景不执行Vimba相关操作
    pass

代码说明

  1. 调用栈分析:inspect.stack() 获取当前的调用栈列表,每个元素包含调用者的栈帧信息。
  2. 过滤自身调用:遍历栈帧时跳过当前模块自身的调用,找到第一个外部调用者。
  3. 双重判断逻辑:同时检查调用者的模块名和脚本文件名,覆盖两种场景:
    • experiment.py 作为主脚本直接运行并导入 detector.py
    • experiment 作为模块被其他脚本导入,再间接导入 detector.py

注意事项

  • 如果你的项目使用了包结构,模块名可能带有前缀(比如 project.experiment),需要调整 caller_mod_name 的判断条件为完整模块路径。
  • inspect 模块的调用栈分析会有轻微性能开销,若你的场景对性能要求极高,可考虑通过环境变量或显式传参的方式替代这种动态判断。

内容的提问来源于stack exchange,提问作者10Electra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:05:20