Python如何在被调用方法中获取调用方文件的Git仓库相对完整路径
实现Git根目录相对路径的改造方案
原实现仅通过os.path.basename提取文件名,丢失了目录层级信息,要返回文件相对Git仓库根目录的完整路径,只需要替换原实现中的路径截取逻辑,新增路径计算步骤即可。
核心改造逻辑
- 从调用栈帧中获取对应文件的绝对路径,消除相对路径、软链带来的定位偏差
- 通过Git原生命令定位当前文件所属的仓库根目录,兼容worktree、submodule等特殊场景
- 计算文件路径相对于仓库根目录的相对路径,替换原本仅取文件名的逻辑
- 适配非Git仓库的边界场景,避免函数调用直接报错
改造后的完整代码
import os import sys import subprocess def WHERE(back = 0): # 获取指定回溯层级的调用栈帧 frame = sys._getframe(back + 1) # 获取栈帧对应文件的真实绝对路径 file_abs_path = os.path.abspath(frame.f_code.co_filename) git_root = None try: # 在文件所在目录下调用Git命令定位仓库根目录 git_root = subprocess.check_output( ["git", "rev-parse", "--show-toplevel"], cwd=os.path.dirname(file_abs_path), stderr=subprocess.DEVNULL, text=True ).strip() except (subprocess.CalledProcessError, FileNotFoundError): # 文件不在Git仓库范围内、或系统无Git命令时,回退为当前工作目录作为路径计算基准 git_root = os.getcwd() # 计算文件相对于Git仓库根目录的相对路径 rel_path = os.path.relpath(file_abs_path, git_root) # 按现有日志格式拼接返回字符串 return f"{rel_path}:{frame.f_lineno} {frame.f_code.co_name}()"
效果验证
按照你提供的项目结构:
- 仓库根目录为
/home/user/project - 触发调用的文件为
/home/user/project/test/function.py
执行改造后的函数,返回结果为:
test/function.py:5
()
完全匹配你预期的路径格式。
实现细节说明
- 没有手动查找
.git文件夹定位仓库根,避免Git worktree、submodule场景下.git为文件而非目录时的定位失效问题 - 兼容系统无Git命令的极端场景,不会因为命令执行失败中断业务逻辑
- 保留原有回溯层级
back参数的逻辑,不会影响原有调用的回溯偏移量 - 统一用冒号分隔路径和行号,和你现有日志的实际输出格式保持一致,不会导致原有日志解析逻辑失效
内容的提问来源于stack exchange,提问作者alper
相关产品推荐
相关产品推荐

