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

Python中绝对/相对路径加载:项目根目录路径重复问题排查

问题描述

项目结构

> nn-project  
   -.env
>  - src
>    - models
>      - bird-model
>        - env.py
>        - train_model.py

.env 文件内容

PROJECT_ROOT = ../

执行代码(env.py)

from dotenv import find_dotenv
from dotenv import load_dotenv
import os
from pathlib import Path

env_file = find_dotenv(".env")
load_dotenv(env_file)

project_root = os.environ.get('PROJECT_ROOT')
if not project_root:
    raise ValueError("PROJECT_ROOT environment variable is not set.")
absolute_path = os.path.abspath(project_root)
data_dir = Path(os.path.join(absolute_path, 'data/raw/boston_housing_price/'))
models_dir = Path(os.path.join(absolute_path, 'models/boston_housing_price/'))
print('***************** LOAD ENVIRONMENT ********************+')
print("Project Root DIR", project_root)
print("Project Root DIR abs", absolute_path)
print("Project Data DIR", data_dir)
print("Models Dump DIR", models_dir)
print('***************** LOAD ENVIRONMENT ********************+')

运行输出

***************** LOAD ENVIRONMENT ********************+
Project Root DIR ../nn-project/
Project Root DIR abs /home/user/Projects/Private/ml-projects/nn-project/nn-project
Project Data DIR /home/user/Projects/Private/ml-projects/nn-project/nn-project/data/raw/boston_housing_price
Models Dump DIR /home/user/Projects/Private/ml-projects/nn-project/nn-project/models/boston_housing_price
***************** LOAD ENVIRONMENT ********************+

输出中nn-project重复出现,请问原因是什么?哪里操作有误?


问题原因与修正方案

核心原因

路径重复源于两个关键问题:

  1. .env配置错误:.env本身就在nn-project根目录下,你设置PROJECT_ROOT = ../,意味着指向根目录的上级目录,但实际运行时当前工作目录可能已经在nn-project内部,解析该相对路径会导致层级混乱。
  2. 路径解析基准错误:os.path.abspath()默认以脚本的运行目录为基准解析相对路径,而非.env文件所在的目录,进一步加剧了路径拼接的重复问题。

修正步骤

1. 修正.env配置

将.env中的PROJECT_ROOT改为.(直接指向.env所在的项目根目录):

PROJECT_ROOT = .

2. 修改路径解析逻辑

基于.env文件的位置确定项目根目录,确保无论在哪个目录运行脚本,路径都能正确解析:

from dotenv import find_dotenv, load_dotenv
import os
from pathlib import Path

# 找到.env文件的绝对路径
env_file = find_dotenv(".env")
load_dotenv(env_file)

# 获取.env所在的目录,以此为基准解析项目根目录
env_dir = os.path.dirname(os.path.abspath(env_file))
project_root_rel = os.environ.get('PROJECT_ROOT')
project_root = os.path.abspath(os.path.join(env_dir, project_root_rel))

data_dir = Path(os.path.join(project_root, 'data/raw/boston_housing_price/'))
models_dir = Path(os.path.join(project_root, 'models/boston_housing_price/'))

# 输出验证
print('***************** LOAD ENVIRONMENT ********************+')
print("Project Root DIR", project_root)
print("Project Data DIR", data_dir)
print("Models Dump DIR", models_dir)
print('***************** LOAD ENVIRONMENT ********************+')

修改后,项目根目录会正确指向/home/user/Projects/Private/ml-projects/nn-project/,不会再出现nn-project重复的情况。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 21:06:09