Python如何实现无需传参即可获取调用方脚本路径的函数
实现方案
你之前写法失效的核心原因是:函数的默认参数file=__file__会在b.py被导入加载时就固定绑定为b.py自身的路径,不会在函数被调用时动态变成调用方的文件路径。
要实现不传__file__自动获取调用方脚本所在目录,直接用Python标准库inspect模块读取调用栈信息即可,不需要额外传参。
改造后的工具函数代码
修改bb/b.py的内容如下:
# bb/b.py import pathlib import inspect def get_current_path(): # 取调用栈的上1帧,即当前函数的直接调用方上下文 caller_frame = inspect.stack()[1] # 从调用方的全局变量字典中读取__file__属性 caller_file = caller_frame.frame.f_globals.get("__file__") # 兜底处理:交互环境、动态执行代码等无对应文件的场景,返回当前工作目录 if not caller_file: return pathlib.Path().resolve() return pathlib.Path(caller_file).parent.resolve()
调用方式
在a.py中直接调用即可,不需要传入__file__参数:
# a.py import bb.b print(bb.b.get_current_path()) # 正确返回a.py所在的目录路径
注意事项
- 该方案完全基于Python标准库实现,无需安装第三方依赖
- 如果存在多层函数嵌套、装饰器包裹
get_current_path的场景,需要对应调整inspect.stack()取的帧索引,当前索引值1对应直接调用该函数的上下文,是常规使用场景下的正确值 - 兜底逻辑可以根据自己的业务需求调整,比如在拿不到调用方文件路径时抛出异常也可以
内容的提问来源于stack exchange,提问作者Curious
相关产品推荐
相关产品推荐

