从Python中的绝对和相对路径加载文件和数据

问题描述 投票:0回答:1

我在Python项目中有以下项目结构:

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

我的 .env 文件中有以下内容:

PROJECT_ROOT = ../

在我的 env.py 中,我执行以下操作:

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.py 中执行以下操作:

from dotenv import find_dotenv
from dotenv import load_dotenv

env_file = find_dotenv(".env")
load_dotenv(env_file)
python environment-variables python-dotenv
1个回答
0
投票

我喜欢使用这样的模式:使用

__file__
锚定到具有已知路径的给定文件,然后走到我知道目标文件所在的位置。

# src/models/bird_model/env.py
from pathlib import Path

def find_dotenv():
    this_file = Path(__file__)
    return this_file.parent.parent.parent.parent.joinpath('.env')

if __name__ == '__main__':
    print(find_dotenv())

无论执行脚本时当前工作目录在哪里,这都有效。

您还可以在路径中使用双点来沿着树向上走,在这种情况下,调用

.resolve()
来获取干净的路径会有所帮助。

 this_file.joinpath('../../../../.env').resolve()
© www.soinside.com 2019 - 2024. All rights reserved.