528 字
1 分钟
路径问题
路径问题
众所周知啊!咱们上传到github上的文件得有.gitignore。里面是让git忽略的文件。最常见的就是.env用于存储环境变量的文件啦!里面大多数是什么数据库的密码呀,个人token呀,小网站的会员密码(bushi)😋
我们在python读取env文件有很多方式,最经典的就是os.getenv(),但是我比较喜欢用pydantic😋
错误示例
.env文件中REPO_NAME=Big-fat-dog/Mizuki_Backstagesetting.pyfrom pydantic_settings import BaseSettings,SettingsConfigDictclass Settings(BaseSettings): REPO_NAME:str
model_config=SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", case_sensitive=False # 不区分大小写 )settings = Settings()if __name__ == "__main__": print(settings.REPO_NAME) #如果你直接运行该脚本会报错!🤔为什么会这样?
当你检查完所有问题后,会锁定错误在这里env_file=".env",那么这个时候就有人要问了!鼠包鼠包,为什么人家github上标准的写法就是这样呢?并且我运行项目后也能读取到环境变量啊!为什么就是在脚本里执行就不能打印呢?
这个就是python的**“位置”**问题
两个位置
先看项目结构

️😎 *脚本位置 (Script Location)*
- 定义:
.py文件在硬盘上物理存放的地方。 - 代表变量:
__file__ - 特点:雷打不动! 无论你在哪运行,
github_service.py永远躺在D:\mizuki_backend\app\services\里。 - 用途:用来找“兄弟文件”(比如同目录下的模板、静态资源)。
🤔****工作目录 (Working Directory / CWD)****
- 定义:你敲下回车键那一刻,终端所在的文件夹。
- 代表变量:
os.getcwd()(Current Working Directory) - 特点:随风飘摇! 你在根目录敲命令,它就在根目录;你在 C 盘敲命令,它就在 C 盘。
- 用途:相对路径的起点! 当你写
open(".env")或env_file=".env"时,Python 是去工作目录找,而不是去脚本位置找!
而我们在pycharm里面点击运行按钮就是工作目录的原理
如果你直接运行github_service.py
Python 的视角:“老板,我现在站在 D:\mizuki_backend\app\services 。” (os.getcwd())“你要我找 .env?”“好嘞,我去 D:\mizuki_backend\app\services\.env 找一下...”🔴 结果:找不到!因为 .env 在上一级目录!💥 爆炸:ValidationError: Field required但是如果你直接启动项目(比如fastapi)
Python 的视角:“老板,我现在站在 D:\mizuki_backend 。” (os.getcwd())“你要我找 .env?”“好嘞,我去 D:\mizuki_backend\.env 找一下...”🟢 结果:找到了!就在脚下!✨ 成功:配置加载完美。综上,这是个恶心人的小坑,控了我半天时间😭 那我就吃一堑吃一堑吃吃吃吃吃吃一一吃一堑,长一智💢
部分信息可能已经过时









