如何获取调用跨文件夹类中方法的脚本的完整路径?
获取调用方文件的完整路径(Python跨包场景)
刚好碰到过类似的跨包调用场景,要在被调用的工具类方法里拿到调用方的文件路径,用Python内置的inspect模块就能轻松搞定,下面给你两种可行的实现方案:
方案一:使用inspect.stack()获取调用栈
这种方法直观,适合快速理解调用层级关系,缺点是会生成整个调用栈的列表,性能略逊于第二种方案。
package2/utils.py 实现
import inspect import os class Utils: @staticmethod def get_caller_full_path(): # 获取调用栈:索引0是当前方法本身,索引1是直接调用该方法的代码所在帧 caller_frame = inspect.stack()[1] # 提取调用方的文件路径并转为绝对路径 caller_path = os.path.abspath(caller_frame.filename) # 手动清理帧引用,避免内存泄漏 del caller_frame return caller_path
package1/main.py 调用示例
from package2.utils import Utils if __name__ == "__main__": main_file_path = Utils.get_caller_full_path() print(f"当前调用方(main.py)的完整路径:{main_file_path}")
方案二:使用inspect.currentframe() + f_back(推荐)
这种方法直接获取当前帧的上一级调用帧,不需要生成整个调用栈,性能更优,也更节省内存。
package2/utils.py 优化实现
import inspect import os class Utils: @staticmethod def get_caller_full_path(): current_frame = inspect.currentframe() try: # 获取调用当前方法的上一级帧 caller_frame = current_frame.f_back # 从调用帧中提取文件路径 caller_file = caller_frame.f_code.co_filename return os.path.abspath(caller_file) finally: # 确保释放帧引用,避免内存泄漏 del current_frame
注意事项
- 如果调用层级更深(比如main.py里的函数A调用了函数B,再由B调用Utils的方法),需要调整帧的索引(方案一)或者多取几次
f_back(方案二)。比如方案一中要取inspect.stack()[2],方案二中要caller_frame = current_frame.f_back.f_back。 - 务必清理帧引用(
del操作),因为Python的帧对象持有对栈的引用,不清理可能导致内存泄漏,尤其是在频繁调用该方法的场景下。
内容的提问来源于stack exchange,提问作者TypeScriptBody
相关产品推荐
相关产品推荐

