如何在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可识别的包,无需手动管理路径:
- 在
model_folder根目录下创建setup.py文件:
from setuptools import setup, find_packages setup( name="my_model_project", version="0.1", packages=find_packages(), )
- 在根目录执行命令,将项目安装为可编辑模式:
pip install -e .
- 之后在任何位置(包括
research下的Notebook)都可以直接导入模块:
from model_modules.foo import Foo from model_modules.bar import Bar
这种方式完全避免了手动路径处理,符合Python项目规范,适合长期维护的项目。
内容的提问来源于stack exchange,提问作者bismo
相关产品推荐
相关产品推荐

