Python 多环境配置管理

一、概述

实际工程开发中常常会对开发、测试和生产等不同环境配置不同的数据库环境,传统方式可以通过添加不同环境的配置文件达到部署时的动态切换的效果。这种方式还不错,不过不同环境间往往会共享相同的配置而造成一些重复工作。

 

项目代码

./
├── conf.py
└── test.py


别看只有2个文件,实际情况是有十几个文件,这里只是举例而已!

 

conf.py 这个是配置文件,其他py文件都依赖于它

复制代码
#!/usr/bin/env python3
# coding: utf-8
# 配置文件

# k8s信息#########################################
# 开发环境####################
K8S_MASTER = "192.168.0.162"
K8S_USERNAME = "root"
K8S_PASSWD = "root"

# # 生产环境####################
# K8S_MASTER = "10.0.0.167"
# K8S_USERNAME = "root"
# K8S_PASSWD = "abcd@1234"
View Code
复制代码

 

test.py 测试文件,下面的代码时伪代码,仅供演示!

复制代码
#!/usr/bin/env python3
# coding: utf-8

import conf

def ssh2(ip,username,password,cmd):  # 远程执行命令
    print(ip,username,password,cmd)
    return True

res = ssh2(conf.K8S_MASTER,conf.K8S_USERNAME,conf.K8S_PASSWD,"uptime")
print(res)
View Code
复制代码

 

需求

目前情况是,执行test.py,是这样的

python3 test.py

 

如果需要切换环境,要修改conf.py,将对应的变量注释掉即可!

但是如果变量过多,注释就太麻烦了!需要有一个变量,能够一键切换环境

 

二、改造配置文件

一键切换

conf.py

复制代码
#!/usr/bin/env python3
# coding: utf-8
# 配置文件
import os

class Config(object):  # 默认配置
    DEBUG = False
    # get attribute
    def __getitem__(self, key):
        return self.__getattribute__(key)

class ProductionConfig(Config):  # 生产环境
    K8S_MASTER = "10.0.0.167"
    K8S_USERNAME = "root"
    K8S_PASSWD = "abcd@1234"

class DevelopmentConfig(Config):  # 开发环境
    K8S_MASTER = "192.168.0.162"
    K8S_USERNAME = "root"
    K8S_PASSWD = "root"

# 环境映射关系
mapping = {
    'development': DevelopmentConfig,
    'production': ProductionConfig,
    'default': DevelopmentConfig
}

# 一键切换环境
APP_ENV = os.environ.get('APP_ENV', 'default').lower()  # 设置环境变量为default
config = mapping[APP_ENV]()  # 获取指定的环境
View Code
复制代码

 

test.py 需要修改导入的模块

复制代码
#!/usr/bin/env python3
# coding: utf-8

# import conf
from conf import config as conf


def ssh2(ip,username,password,cmd):  # 远程执行命令
    print(ip,username,password,cmd)
    return True

res = ssh2(conf.K8S_MASTER,conf.K8S_USERNAME,conf.K8S_PASSWD,"uptime")
print(res)
复制代码

 

执行test.py,输出:

192.168.0.162 root root uptime
True

 

 

 现在需要切换环境,直接修改 conf.py 的倒数第二行

APP_ENV = os.environ.get('APP_ENV', 'production').lower()  # 设置环境变量为default
config = mapping[APP_ENV]()  # 获取指定的环境

 

 再次执行test.py,输出:

10.0.0.167 root abcd@1234 uptime
True

 

脚本执行切换

改conf.py切换环境,不够灵活,需要执行脚本时,带一个参数,由这个参数来决定环境,比如:

python test.py dev

 

这样,就可以切换到开发环境!怎么做呢?

很简单,只需要修改conf.py即可!因为其他文件,都依赖于它

 

conf.py

复制代码
#!/usr/bin/env python3
# coding: utf-8
# 配置文件
import os

class Config(object):  # 默认配置
    DEBUG = False
    # get attribute
    def __getitem__(self, key):
        return self.__getattribute__(key)

class ProductionConfig(Config):  # 生产环境
    K8S_MASTER = "10.0.0.167"
    K8S_USERNAME = "root"
    K8S_PASSWD = "abcd@1234"

class DevelopmentConfig(Config):  # 开发环境
    K8S_MASTER = "192.168.0.162"
    K8S_USERNAME = "root"
    K8S_PASSWD = "root"

# 环境映射关系
mapping = {
    'dev': DevelopmentConfig,
    'pro': ProductionConfig,
    'default': DevelopmentConfig
}

# # 一键切换环境
# APP_ENV = os.environ.get('APP_ENV', 'production').lower()  # 设置环境变量为default
# config = mapping[APP_ENV]()  # 获取指定的环境

# 根据脚本参数,来决定用那个环境配置
import sys
# print(sys.argv)
num = len(sys.argv) - 1  #参数个数
if num < 1 or num > 1:
    exit("参数错误,必须传环境变量!比如: python xx.py dev|pro|default")

env = sys.argv[1]  # 环境
# print(env)
APP_ENV = os.environ.get('APP_ENV', env).lower()
config = mapping[APP_ENV]()  # 实例化对应的环境
View Code
复制代码

 

再次执行test.py

python test.py

 

 输出:

参数错误,必须传环境变量!比如: python xx.py dev|pro|default

 

切换到开发环境

python test.py dev

 

输出:

192.168.0.162 root root uptime
True

 


切换到生产环境

输出:

10.0.0.167 root abcd@1234 uptime
True

 

 

本文参考链接:

https://blog.yuanbin.me/posts/2018-02/2018-02-24_16-30-16/

posted @   肖祥  阅读(4089)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示