本文详解如何通过 python-dotenv 实现 qa、staging、production 等多环境配置隔离,支持命令行动态指定环境,并提供可复用的工程化实践方案。
本文详解如何通过 python-dotenv 实现 qa、staging、production 等多环境配置隔离,支持命令行动态指定环境,并提供可复用的工程化实践方案。
在实际项目开发中,不同部署环境(如开发、测试、预发、生产)往往需要独立的配置参数(如 API 地址、数据库连接串、密钥等)。若仅依赖单一 .env 文件,不仅易出错,也难以维护。python-dotenv 本身不内置多环境切换机制,但可通过灵活调用 load_dotenv() 并结合环境变量或命令行参数实现优雅解耦。
首先,按环境命名配置文件(建议统一放在 config/ 目录下):
config/├── .env.development # 开发环境├── .env.qa # 测试环境├── .env.staging # 预发环境└── .env.prod # 生产环境
每个文件内容示例(config/.env.qa):
HOST=https://api.qa.example.comDEBUG=FalseDATABASE_URL=postgresql://qa:pass@db-qa:5432/app
接着,在主程序中解析命令行参数并加载对应环境配置:
立即学习“Python免费学习笔记(深入)”;
# app.pyimport osimport sysfrom pathlib import Pathfrom dotenv import load_dotenvdef load_env_by_arg(): # 1. 从命令行获取环境名(默认 development) if len(sys.argv) < 2: print("Usage: python app.py [development|qa|staging|prod]") sys.exit(1) env_name = sys.argv[1].lower() valid_envs = {"development", "qa", "staging", "prod"} if env_name not in valid_envs: print(f"Error: Invalid environment '{env_name}'. Choose from {valid_envs}") sys.exit(1) # 2. 构建配置路径(假设 config/ 与当前脚本同级) dotenv_path = Path("config") / f".env.{env_name}" if not dotenv_path.exists(): raise FileNotFoundError(f"Missing environment file: {dotenv_path}") # 3. 加载配置 load_dotenv(dotenv_path=dotenv_path, override=True) print(f"✅ Loaded environment: {env_name} from {dotenv_path}")if __name__ == "__main__": load_env_by_arg() # 示例:读取配置 host = os.getenv("HOST", "http://localhost:8000") debug = os.getenv("DEBUG", "False").lower() == "true" print(f"HOST = {host}") print(f"DEBUG = {debug}")
执行方式:
python app.py qa # 加载 config/.env.qapython app.py prod # 加载 config/.env.prod
config/.env.*
通过以上方式,你无需额外编写复杂设置文件,即可用原生 python-dotenv 实现清晰、安全、可扩展的多环境配置管理。