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重复出现,请问原因是什么?哪里操作有误?
问题原因与修正方案
核心原因
路径重复源于两个关键问题:
- .env配置错误:
.env本身就在nn-project根目录下,你设置PROJECT_ROOT = ../,意味着指向根目录的上级目录,但实际运行时当前工作目录可能已经在nn-project内部,解析该相对路径会导致层级混乱。 - 路径解析基准错误:
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
相关产品推荐
相关产品推荐

