如何使项目所有目录下的路径均可被正确识别访问?
项目跨目录路径访问问题
项目结构
. ├── amr │ ├── __init__.py │ └── ... ├── amr_config.yaml ├── data │ └── ... ├── notebooks │ └── ... └── pyproject.toml
配置与问题
amr_config.yaml中的路径配置:
DB_QUERIES_PATHS: REQUESTS: $REQUESTS|'./data/requests_data_query.sql'
从项目根目录运行脚本时一切正常,但在notebooks目录下运行Notebook时,会抛出错误:
FileNotFoundError: [Errno 2] No such file or directory: './data/requests_data_query.sql'
最佳解决方案
1. 动态获取项目根目录(推荐)
在代码中通过项目文件的位置动态定位根目录,彻底摆脱当前工作目录的限制。
在amr/__init__.py中添加根目录获取逻辑:
from pathlib import Path # 基于当前文件位置向上追溯到项目根(pyproject.toml所在目录) PROJECT_ROOT = Path(__file__).parent.parent.resolve()
读取配置时将相对路径转换为绝对路径:
import yaml with open(PROJECT_ROOT / "amr_config.yaml", "r") as f: config = yaml.safe_load(f) # 处理配置中的路径 raw_path = config["DB_QUERIES_PATHS"]["REQUESTS"].strip("'") absolute_path = PROJECT_ROOT / raw_path
后续所有文件操作都使用这个绝对路径即可。
2. 配置文件中使用占位符+环境变量
修改amr_config.yaml,用占位符表示项目根:
DB_QUERIES_PATHS: REQUESTS: $REQUESTS|'{PROJECT_ROOT}/data/requests_data_query.sql'
在运行脚本或Notebook前设置环境变量:
# Linux/macOS export PROJECT_ROOT="/实际项目根路径" # Windows set PROJECT_ROOT="C:\实际项目根路径"
代码中读取环境变量并替换占位符:
import os import yaml from pathlib import Path # 优先用环境变量,否则动态获取 project_root = os.getenv("PROJECT_ROOT", Path(__file__).parent.parent.resolve()) with open("amr_config.yaml", "r") as f: config_content = f.read().replace("{PROJECT_ROOT}", str(project_root)) config = yaml.safe_load(config_content)
3. Notebook中切换工作目录
在Notebook开头添加代码,强制切换工作目录到项目根:
import os from pathlib import Path # 从notebooks目录向上跳一级到根目录 os.chdir(Path.cwd().parent.resolve())
这种方法简单直接,但如果Notebook移动位置,代码需要同步调整,通用性稍弱。
4. 依赖项目管理工具固定工作目录
如果使用poetry或pipenv,直接通过工具启动Notebook,确保工作目录为项目根:
# 使用poetry启动 poetry run jupyter notebook # 使用pipenv启动 pipenv run jupyter notebook
内容的提问来源于stack exchange,提问作者NineWasps
相关产品推荐
相关产品推荐

