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
代码说明
- 调用栈分析:
inspect.stack()获取当前的调用栈列表,每个元素包含调用者的栈帧信息。 - 过滤自身调用:遍历栈帧时跳过当前模块自身的调用,找到第一个外部调用者。
- 双重判断逻辑:同时检查调用者的模块名和脚本文件名,覆盖两种场景:
experiment.py作为主脚本直接运行并导入detector.pyexperiment作为模块被其他脚本导入,再间接导入detector.py
注意事项
- 如果你的项目使用了包结构,模块名可能带有前缀(比如
project.experiment),需要调整caller_mod_name的判断条件为完整模块路径。 inspect模块的调用栈分析会有轻微性能开销,若你的场景对性能要求极高,可考虑通过环境变量或显式传参的方式替代这种动态判断。
内容的提问来源于stack exchange,提问作者10Electra
相关产品推荐
相关产品推荐

