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

如何获取调用跨文件夹类中方法的脚本的完整路径?

获取调用方文件的完整路径(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:29:05