在软件开发过程中,我们经常需要面对不同的运行环境:开发环境、测试环境、生产环境等。每个环境的配置参数(如数据库连接、日志级别、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)

方案优势

  1. 配置与代码分离:配置文件独立存放,修改配置无需改动代码
  2. 环境隔离:不同环境使用各自独立的配置文件,避免配置混乱
  3. 灵活切换:通过环境变量一键切换环境,适合容器化部署
  4. 结构清晰:按功能模块(config、log、mysql等)组织配置目录
  5. 类型安全pyhocon支持层级配置和类型解析

扩展建议

你可以根据项目需求,进一步扩展配置目录:

  • env/mysql/:存放不同环境的MySQL配置
  • env/redis/:存放不同环境的Redis配置
  • env/mongodb/:存放不同环境的MongoDB配置

每个子目录都可以按照相同的模式组织:dev.confsit.confonline.conf等。

总结

这种基于env目录结构的多环境配置方案,通过统一的环境变量驱动,实现了配置的集中管理和环境的灵活切换。配合pyhocon的强大解析能力,可以轻松处理复杂的层级配置。在实际项目中,这种方案已经稳定运行,值得推荐使用。

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐