python项目实现多环境配置
·
在软件开发过程中,我们经常需要面对不同的运行环境:开发环境、测试环境、生产环境等。每个环境的配置参数(如数据库连接、日志级别、API地址等)往往各不相同。如何在Python项目中优雅地管理这些多环境配置,是每个开发者都需要面对的问题。
本文将介绍一种基于env目录结构和pyhocon配置库的多环境配置解决方案。
项目目录结构
project_root/
├── env/
│ ├── config/
│ │ ├── beta.conf
│ │ ├── ci.conf
│ │ ├── dev.conf
│ │ ├── online.conf
│ │ ├── sit.conf
│ │ └── unittest.conf
│ ├── log/
│ │ ├── beta.conf
│ │ ├── ci.conf
│ │ ├── dev.conf
│ │ ├── online.conf
│ │ ├── sit.config
│ │ └── unittest.config
│ ├── mongodb/
│ ├── mysql/
│ ├── redis/
│ ├── __init__.py
│ └── settings.py
├── mgap_sdk/
│ ├── bo/
│ ├── controller/
│ ├── dao/
│ ├── __init__.py
│ └── env.py
└── ...
目录结构如下:
核心实现:settings.py
env/settings.py是整个配置方案的核心,它负责根据环境变量加载对应的配置文件:
from pyhocon import ConfigFactory
import os
# 从环境变量获取当前环境,默认为dev
ENV = os.environ.get('X_ENV')
if ENV is None:
ENV = 'dev'
print(f'启动环境 {ENV}')
# 加载config配置文件
conf_path = os.path.join(os.path.dirname(os.path.dirname(
__file__)), "env", "config", f"{ENV}.conf")
config = ConfigFactory.parse_file(conf_path)
# 加载log配置文件
log_conf_path = os.path.join(os.path.dirname(os.path.dirname(
__file__)), "env", "log", f"{ENV}.conf")
log_config = ConfigFactory.parse_file(log_conf_path)
配置文件示例
config/dev.conf
{
"argo": {
"host": "http://argo-ui.argo:80",
"env": "dev"
}
}
log/dev.conf
{
"log": {
"level": "INFO",
"format": "%(asctime)s mgap-stats %(filename)s[line:%(lineno)d] %(funcName)s %(levelname)s %(message)s"
}
}
在项目中使用配置
import logging
from env.settings import log_config, config
# 配置日志
logging.basicConfig(
level=log_config['log.level'],
format=log_config['log.format']
)
logger = logging.getLogger(__name__)
def print_argo_detail():
host = config['argo.host']
env = config['argo.env']
logger.info('The argo config is (%s, %s)', host, env)
环境切换方式
通过设置环境变量X_ENV来切换不同的环境:
# 开发环境
export X_ENV=dev
python main.py
# 测试环境
export X_ENV=sit
python main.py
# 生产环境
export X_ENV=online
python main.py
重要注意事项
配置文件格式要求
在使用pyhocon解析配置文件时,有一个容易踩的坑:配置文件必须使用双引号,不能使用单引号。
错误示例(使用单引号):
{
'argo': {
'host': 'http://argo-ui.argo:80',
'env': 'dev'
}
}
正确示例(使用双引号):
{
"argo": {
"host": "http://argo-ui.argo:80",
"env": "dev"
}
}
如果错误地使用了单引号,会抛出以下异常:
pyparsing.ParseException: Expected "]" (at char 283), (line:23, col:13)
方案优势
- 配置与代码分离:配置文件独立存放,修改配置无需改动代码
- 环境隔离:不同环境使用各自独立的配置文件,避免配置混乱
- 灵活切换:通过环境变量一键切换环境,适合容器化部署
- 结构清晰:按功能模块(config、log、mysql等)组织配置目录
- 类型安全:
pyhocon支持层级配置和类型解析
扩展建议
你可以根据项目需求,进一步扩展配置目录:
env/mysql/:存放不同环境的MySQL配置env/redis/:存放不同环境的Redis配置env/mongodb/:存放不同环境的MongoDB配置
每个子目录都可以按照相同的模式组织:dev.conf、sit.conf、online.conf等。
总结
这种基于env目录结构的多环境配置方案,通过统一的环境变量驱动,实现了配置的集中管理和环境的灵活切换。配合pyhocon的强大解析能力,可以轻松处理复杂的层级配置。在实际项目中,这种方案已经稳定运行,值得推荐使用。
更多推荐




所有评论(0)