环境变量是操作系统中存储配置信息的键值对,用于在不同环境(开发/测试/生产)中切换配置,避免敏感信息(密码、密钥)硬编码在代码中。
一、配置环境变量的方式
1. 操作系统级别设置
linux/macos
# 临时设置(当前终端会话有效) export database_url="postgresql://localhost/mydb" export api_key="sk-123456" # 永久设置(写入配置文件) echo 'export database_url="postgresql://localhost/mydb"' >> ~/.bashrc # 或 ~/.zshrc source ~/.bashrc # 查看环境变量 echo $database_url env | grep database
windows (cmd)
# 临时设置 set database_url=postgresql://localhost/mydb # 永久设置(通过系统设置) setx database_url "postgresql://localhost/mydb"
windows (powershell)
# 临时设置
$env:database_url="postgresql://localhost/mydb"
# 永久设置
[environment]::setenvironmentvariable("database_url", "postgresql://localhost/mydb", "user")2. 使用.env文件(推荐)
.env 文件是项目级别的环境变量配置,应该被添加到 .gitignore 中,避免提交到版本控制。
# .env 文件示例 database_url=postgresql://localhost:5432/mydb api_key=sk-1234567890 debug=true secret_key=your-secret-key-here redis_url=redis://localhost:6379/0
3. 使用python-dotenv读取.env
# 安装依赖 pip install python-dotenv
# 方式1:自动查找 .env 文件
from dotenv import load_dotenv
import os
load_dotenv() # 加载 .env 文件
db_url = os.getenv("database_url")
api_key = os.environ.get("api_key")
# 方式2:指定 .env 文件路径
load_dotenv("/path/to/.env.production")
# 方式3:覆盖已有的环境变量
load_dotenv(override=true)4. ide 中配置(pycharm / vs code)
pycharm
run→edit configurationsenvironment variables中添加key=value- 或点击
...图标批量添加
vs code
在 .vscode/launch.json 中配置:
{
"version": "0.2.0",
"configurations": [
{
"name": "python: current file",
"type": "python",
"request": "launch",
"env": {
"database_url": "postgresql://localhost/mydb",
"api_key": "sk-123456"
}
}
]
}5. docker 容器中配置
# 方式1:-e 参数 docker run -e database_url="postgresql://db/mydb" myapp # 方式2:--env-file 参数 docker run --env-file .env myapp # 方式3:docker-compose.yml
# docker-compose.yml
version: '3.8'
services:
app:
build: .
environment:
- database_url=postgresql://db/mydb
- api_key=${api_key} # 从宿主机环境变量传入
env_file:
- .env二、读取环境变量的方式
1. 基础读取(os.environ)
import os
# 获取环境变量(不存在返回 none)
db_url = os.environ.get("database_url")
print(db_url)
# 获取环境变量(不存在时使用默认值)
api_key = os.environ.get("api_key", "default-key")
# 直接访问(不存在会抛出 keyerror)
debug = os.environ["debug"]
# 检查环境变量是否存在
if "database_url" in os.environ:
print("已配置数据库连接")2. 类型转换
import os
# 字符串转布尔值
debug = os.getenv("debug", "false").lower() == "true"
# 字符串转整数
port = int(os.getenv("port", "8080"))
# 字符串转列表
allowed_hosts = os.getenv("allowed_hosts", "").split(",")
# 使用更强大的库:python-decouple
from decouple import config
debug = config("debug", default=false, cast=bool)
port = config("port", default=8080, cast=int)3. 使用os.getenv()简写
import os
# os.getenv() 不存在返回 none,与 os.environ.get() 相同
db_url = os.getenv("database_url")
# 设置默认值
api_key = os.getenv("api_key", "default-key")三、项目示例
项目结构
myproject/ ├── .env # 环境变量文件(不提交到 git) ├── .env.example # 环境变量模板(提交到 git) ├── .gitignore # 忽略 .env ├── config.py # 配置读取模块 ├── main.py └── requirements.txt
.env文件
# 环境标识 environment=development debug=true # 数据库配置 database_url=postgresql://localhost:5432/mydb database_pool_size=10 # api 配置 api_key=sk-test-123456 api_secret=test-secret # redis 配置 redis_url=redis://localhost:6379/0 # 应用配置 secret_key=your-secret-key allowed_hosts=localhost,127.0.0.1
.env.example文件(提交到 git)
# 环境标识 environment=development debug=false # 数据库配置 database_url=postgresql://localhost:5432/mydb database_pool_size=10 # api 配置 api_key= api_secret= # redis 配置 redis_url=redis://localhost:6379/0 # 应用配置 secret_key=change-this-in-production allowed_hosts=localhost,127.0.0.1
config.py- 配置管理模块
import os
from dotenv import load_dotenv
from pathlib import path
# 加载 .env 文件
# 优先使用 .env 文件,如果没有则使用环境变量
env_file = path(".env")
if env_file.exists():
load_dotenv(env_file)
class config:
"""应用配置类"""
# 环境配置
environment = os.getenv("environment", "production")
debug = os.getenv("debug", "false").lower() == "true"
# 数据库配置
database_url = os.getenv("database_url")
database_pool_size = int(os.getenv("database_pool_size", "10"))
# api 配置
api_key = os.getenv("api_key")
api_secret = os.getenv("api_secret")
# redis 配置
redis_url = os.getenv("redis_url", "redis://localhost:6379/0")
# 应用配置
secret_key = os.getenv("secret_key")
allowed_hosts = os.getenv("allowed_hosts", "").split(",")
@classmethod
def validate(cls):
"""验证必要的配置是否存在"""
required = ["database_url", "secret_key"]
missing = [key for key in required if not getattr(cls, key)]
if missing:
raise valueerror(f"缺少必要的环境变量: {', '.join(missing)}")
return true
# 实例化配置
config = config().gitignore文件
# 环境变量文件 .env .env.local .env.*.local # python 缓存 __pycache__/ *.pyc
main.py- 使用配置
from config import config
# 验证配置
config.validate()
print(f"环境: {config.environment}")
print(f"调试模式: {config.debug}")
print(f"数据库: {config.database_url}")
print(f"允许的主机: {config.allowed_hosts}")
# 在应用中使用
if config.debug:
print("开发环境启动...")
else:
print("生产环境启动...")五、其他
| 原则 | 说明 |
|---|---|
| 不要硬编码 | 敏感信息永远不要写在代码里 |
使用 .env | 开发环境推荐使用 .env 文件 |
提交 .env.example | 提供配置模板,但不提交真实值 |
忽略 .env | 确保 .env 在 .gitignore 中 |
| 提供默认值 | 使用 os.getenv("key", "default") 提供默认值 |
| 类型转换 | 注意环境变量都是字符串,需要手动转换 |
| 验证必要配置 | 启动时检查必要的环境变量是否存在 |
备注:多环境下用不同 .env 文件,使用 pydantic 配置更安全。
以上就是python项目中存储配置信息方式汇总的详细内容,更多关于python存储配置信息方式的资料请关注代码网其它相关文章!
发表评论