最常见原因是环境变量未在进程启动前加载,os.getenv()仅读取已存在的变量,不自动加载.env文件或shell配置;需用echo验证、IDE中注意环境继承、默认值兜底,生产环境禁用python-dotenv。
os.getenv() 读取环境变量时为什么返回 None
最常见原因是变量根本没被系统加载,不是代码写错了。Python 的 os.getenv() 只读
取进程启动时已存在的环境变量,不会自动加载 .env 文件或 shell 配置里的内容。
echo $DATABASE_URL,有输出才说明环境里真有这个变量source .env 加载,确保是在同一 shell 中运行 python app.py,别在 IDE 里点运行——多数 IDE 不继承 shell 的环境变量os.getenv("DEBUG", "false").lower() == "true",避免 None 导致类型错误python-dotenv?什么场景下必须用它只在开发阶段有用,本质是把 .env 文件内容塞进 os.environ。生产环境不该依赖它——配置应由运维通过真实环境变量注入,而不是靠读文件。
from dotenv import load_dotenv load_dotenv() # 自动找 .env 并加载
env: 或 --env 注入,不调 load_dotenv()
.env 和系统变量同名,load_dotenv(override=True) 才能覆盖,否则系统变量优先pydantic-settings 比手写 os.getenv() 强在哪它把“读环境变量→转类型→校验→设默认值”全包了,且支持嵌套结构和多源合并(比如环境变量 + TOML 配置文件),适合中大型项目。
PORT: int = Field(default=8000),不用再写 int(os.getenv("PORT", "8000"))
EMAIL: EmailStr 会直接报错,而不是等发邮件时才发现格式不对SECRET_KEY 这类字段默认显示为 ********
from pydantic_settings import BaseSettingsclass Settings(BaseSettings): DEBUG: bool = False DATABASE_URL: str JWT_SECRET: str
settings = Settings()
别把密钥写进 Dockerfile 或镜像层,也别硬编码在 docker-compose.yml 的 environment: 下——这些都可能被 docker inspect 看到。
env_file: + .env(仅限非敏感配置),密钥走 secrets: 或挂载文件Secret 对象,以 base64 编码存,再通过 envFrom: 注入:envFrom:
- secretRef:
name: app-secretsos.getenv() 读,不要区分“这是 Docker 给的还是本地给的”——解耦就体现在这里环境变量不是万能胶,填错位置、混用开发/生产逻辑、忽略类型校验,三者任一都会让“解耦”变成“更难排查”。真正关键的是:谁负责设置变量、在哪个环节注入、出错时有没有明确反馈路径。