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

如何在Python中从目录任意位置获取根目录绝对路径

如何在Python中从目录任意位置获取项目根目录绝对路径

问题背景

现有目录结构如下:

model_folder
├── model_modules
│   ├── __init__.py
│   ├── foo.py
│   └── bar.py
├── research
│   ├── training.ipynb
│   └── eda.ipynb
└── main.py

需要在research目录下的脚本/Notebook中导入model_modules,但不想硬编码model_folder的绝对路径(避免路径变更导致代码失效)。尝试新增src/utils.py来获取根目录:

# src/utils.py
from pathlib import Path

def get_project_root() -> Path:
    return Path(__file__).parent.parent

但在training.ipynb中执行from src.utils import get_project_root时,出现ModuleNotFoundError: No module named 'src'的报错。

解决方案

方法1:无需额外文件,直接在目标文件中定位根目录

针对Jupyter Notebook场景,可通过遍历文件系统找到根目录(以存在main.py作为根目录标识),无需新增工具文件:

from pathlib import Path
import sys

# 从当前工作目录向上遍历,直到找到main.py所在的目录
root = Path().resolve()
while not (root / "main.py").exists():
    root = root.parent

# 将根目录加入Python搜索路径
sys.path.append(str(root))

# 正常导入目标模块
from model_modules.foo import Foo
from model_modules.bar import Bar

这种方式无需依赖额外文件,直接在需要的Notebook中编写,适合快速解决路径问题。

方法2:修复utils.py的导入逻辑

如果想保留src/utils.py的方案,需要先将项目根目录加入Python的搜索路径,再导入工具函数:

from pathlib import Path
import sys

# 定位根目录(假设当前Notebook运行在research目录下)
root = Path().resolve().parent
sys.path.append(str(root))

# 导入utils模块
from src.utils import get_project_root
root = get_project_root()

# 导入目标模块
from model_modules.foo import Foo
from model_modules.bar import Bar

方法3:将项目安装为可编辑包(推荐)

这是最规范的长期解决方案,把项目变成Python可识别的包,无需手动管理路径:

  1. 在model_folder根目录下创建setup.py文件:
from setuptools import setup, find_packages

setup(
    name="my_model_project",
    version="0.1",
    packages=find_packages(),
)
  1. 在根目录执行命令,将项目安装为可编辑模式:
pip install -e .
  1. 之后在任何位置(包括research下的Notebook)都可以直接导入模块:
from model_modules.foo import Foo
from model_modules.bar import Bar

这种方式完全避免了手动路径处理,符合Python项目规范,适合长期维护的项目。

内容的提问来源于stack exchange,提问作者bismo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:31:02