
本文介绍如何使用 python-dotenv 动态加载多环境配置文件(如 .env.dev、.env.qa、.env.prod),并通过命令行参数或环境变量指定当前环境,实现配置隔离与部署灵活性。
本文介绍如何使用 python-dotenv 动态加载多环境配置文件(如 `.env.dev`、`.env.qa`、`.env.prod`),并通过命令行参数或环境变量指定当前环境,实现配置隔离与部署灵活性。
在实际项目中,不同部署环境(开发、测试、预发布、生产)往往需要独立的配置项(如数据库地址、API 端点、密钥等)。硬编码或手动切换 .env 文件既易出错又不可持续。python-dotenv 本身不内置多环境支持,但可通过组合标准 Python 机制(环境变量 + 命令行参数 + 文件路径动态拼接)优雅解决。
✅ 推荐方案:命令行传参 + 动态加载
最清晰可控的方式是通过命令行参数指定环境名,再据此加载对应 .env.{env} 文件。以下为完整示例:
# config_loader.py
import os
import sys
from dotenv import load_dotenv
from pathlib import Path
def load_env_by_cli_arg():
# 检查是否传入环境参数,例如: python config_loader.py qa
if len(sys.argv) < 2:
raise ValueError("Usage: python config_loader.py <environment> (e.g., dev, qa, staging, prod)")
env_name = sys.argv[1].strip().lower()
valid_environments = {'dev', 'qa', 'staging', 'prod'}
if env_name not in valid_environments:
raise ValueError(f"Invalid environment '{env_name}'. Must be one of: {valid_environments}")
# 构建 .env 文件路径(假设位于项目根目录)
dotenv_file = Path(f".env.{env_name}")
if not dotenv_file.exists():
raise FileNotFoundError(f"Environment file '{dotenv_file}' not found.")
# 加载配置
load_dotenv(dotenv_path=dotenv_file, override=True)
print(f"✅ Loaded configuration from {dotenv_file}")
if __name__ == "__main__":
load_env_by_cli_arg()
# 示例:读取配置
host = os.getenv("HOST", "http://localhost:8000")
api_key = os.getenv("API_KEY", "")
print(f"HOST = {host}")
print(f"API_KEY length = {len(api_key)} characters")使用方式:
python config_loader.py dev # 加载 .env.dev python config_loader.py qa # 加载 .env.qa python config_loader.py prod # 加载 .env.prod
? 备选方案:通过系统环境变量控制(适合容器化部署)
若需适配 Docker 或 CI/CD 流水线,可改用 ENVIRONMENT 环境变量自动识别:
import os
from dotenv import load_dotenv
from pathlib import Path
env_name = os.getenv("ENVIRONMENT", "dev").lower()
dotenv_path = Path(f".env.{env_name}")
if dotenv_path.exists():
load_dotenv(dotenv_path=dotenv_path, override=True)
print(f"Loaded {dotenv_path}")
else:
raise FileNotFoundError(f"Missing environment file: {dotenv_path}")启动时设置:
ENVIRONMENT=prod python app.py # 或在 Docker 中: # docker run -e ENVIRONMENT=staging myapp
⚠️ 注意事项与最佳实践
- 文件位置:建议将所有 .env.* 文件统一放在项目根目录(或明确子目录如 config/),并在 .gitignore 中排除敏感文件(如 .env.prod),仅保留模板(如 .env.example)。
- override=True:启用该参数可确保新加载的变量覆盖已存在的同名环境变量,避免意外继承。
- 默认回退:始终提供合理的默认值(如 os.getenv("HOST", "http://localhost")),避免因缺失配置导致运行时异常。
- 安全性提醒:.env 文件不应提交至版本库;生产环境更推荐直接通过操作系统环境变量注入(而非文件),以规避文件泄露风险。
通过以上方式,你无需额外编写复杂配置管理模块,即可用原生 python-dotenv 实现轻量、可靠、可维护的多环境配置加载体系。


















