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

如何使项目所有目录下的路径均可被正确识别访问?

项目跨目录路径访问问题

项目结构

.
├── 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 07:33:20