This guide explains how to manage different environments (development, staging, production) using .env files and Python's dotenv.
project-root/
βββ .env # Optional: base ENV loader
βββ .env.dev # Development environment variables
βββ .env.stage # Staging environment variables
βββ .env.prod # Production environment variables
βββ load\_env.py # Environment loader script
βββ main.py # Your app entry point
import os
from dotenv import load_dotenv
# Load base .env (optional) to fetch ENV variable
load_dotenv(".env")
# Get current ENV type
env_type = os.getenv("ENV", "development")
print("ENV from system:", env_type)
# Map ENV to corresponding .env file
env_file = {
"development": ".env.dev",
"stage": ".env.stage",
"production": ".env.prod",
}.get(env_type)
if env_file is None:
raise ValueError("Unknown ENV value. Must be one of: development, stage, production.")
print(f"Using environment file: {env_file}")
# Load the appropriate environment file
load_dotenv(dotenv_path=env_file, override=True)ENV=development
DB_NAME=dev_ai_db
DB_USERNAME=dev_ai_user
DB_PASSWORD=dev_password
DB_HOST=localhost
DB_PORT=5432ENV=stage
DB_NAME=stage_ai_db
DB_USERNAME=stage_ai_user
DB_PASSWORD=stage_password
DB_HOST=staging-db.example.com
DB_PORT=5432ENV=production
DB_NAME=ai_db
DB_USERNAME=ai_user
DB_PASSWORD=prod_password
DB_HOST=prod-db.example.com
DB_PORT=5432$env:ENV="stage"; python main.pyset ENV=stage && python main.pySet ENV=stage in a .env file:
ENV=stageThen run:
python main.py- β Never commit
.env.prodto version control. - β
Use
.env+load_env.pyfor safer config switching. - β
Use
override=Trueinload_dotenvto avoid conflict. - β
Confirm loaded file with a
print()for debugging.
Happy coding! π§ βοΈ