我在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)
我喜欢使用这样的模式:使用
__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()