51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 530|回复: 0
打印 上一主题 下一主题

[python] 一篇文章告诉你Python多环境配置管理

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-11-7 15:33:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 草帽路飞UU 于 2022-11-7 15:41 编辑

一、概述

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

同的配置而造成一些重复工作。

  项目代码



  ./

  ├── 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"




  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)




  需求


  目前情况是,执行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]()  # 获取指定的环境




  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]()  # 实例化对应的环境




  再次执行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











分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-5-5 14:10 , Processed in 0.066307 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表