zoukankan      html  css  js  c++  java
  • python之环境变量(测试环境可配置)

      想要实现的结果是:

      执行脚本时,带一个参数,由这个参数来决定测试环境(开发or测试),比如:

    python test.py dev

       实现代码:

      方式1 不用__getitem__方式:

     1 import os
     2 
     3 class OnlineConfig(object):
     4     HOST="appapi.5i5j.com"
     5 class ReleaseConfig(object):
     6     HOST="appts.5i5j.com"
     7 
     8 mapping = {
     9     "online":OnlineConfig,
    10     "release":ReleaseConfig
    11 }
    12 
    13 #根据脚本参数,来决定用那个环境配置
    14 import sys
    15 print(sys.argv)  #在终端输入命令 python conf2.py online, 返回一个列表['conf2.py', 'online']
    16 
    17 num = len(sys.argv)-1
    18 if num<1 or num >1:
    19     exit("参数错误,必须传环境变量!比如: python xx.py online|release")
    20 env = sys.argv[1]
    21 # print(env)
    22 APP_ENV=os.environ.get("APP_ENV",env).lower() 
    23 print("APP_ENV:",APP_ENV)
    24 config=mapping[APP_ENV]()
    25 
    26 
    27 if __name__ == "__main__":
    28     print(config.HOST)

    解释一下:

    一开始第22行,不明白为什么要使用第22行的语句,

    因为直接使用config=mapping[env]()也是可以正确运行的。

    后来想明白:mapping的key都是小写,若有人输入大写字母则会匹配不到对应的value。

    如下所示:即使输入了大写字母,程序也会正确运行

    (build) Mac mini:build 5i5j$ python3 changeEnv.py RELEASE
    ['changeEnv.py', 'RELEASE']
    APP_ENV: release
    appts.5i5j.com

     方式2 使用__getitem__方式:

     1 import os
     2 
     3 class Config(object):
     4     '''
     5     根据给定的环境,返回不同的host
     6     '''
     7 
     8     mapping = {
     9         'online': 'appapi.5i5j.com',
    10         'release': 'appts.5i5j.com'
    11     }
    12     14     def __getitem__(self, envKey):
    15         return self.mapping[envKey]
    16 
    17 #利用脚本参数输入,获得运行环境(envKey)
    18 import sys
    19 # print(sys.argv)  #在终端输入命令 python conf2.py online, 返回一个列表['conf2.py', 'online']
    20 
    21 #如果多传参数,或者没有传,退出程序,并给出错误提示
    22 num = len(sys.argv)-1
    23 if num<1 or num >1:
    24     exit("参数错误,必须传环境变量!比如: python xx.py online|release")
    25 env = sys.argv[1]
    26 APP_ENV=os.environ.get("APP_ENV",env).lower()
    27 # print(APP_ENV)
    28     
    29 
    30 if __name__ == "__main__":
    31 
    32     # 测试代码
    33     config = Config()
    34     print(config[APP_ENV])

    在命令行输入运行命令:python3 changeEnv.py online

    1 (build) Mac mini:build 5i5j$ python3 changeEnv.py release
    2 appts.5i5j.com
    3 (build) Mac mini:build 5i5j$ python3 changeEnv.py online
    4 appapi.5i5j.com

    可以看到打印的是online所对应的host

    其它一些知识点 

      os.environ.get()方法表示什么意思?
    import os
    
    JS_ADDRESS = os.environ.get("PALM_JS_ADDRESS")
    print(os.environ.get("PALM_JS_ADDRESS"))

       什么是环境变量,环境变量是程序和操作系统之间的通信方式。有些字符不宜明文写进代码里,比如数据库密码,个人账户密码,如果写进自己本机的环境变量里,程序用的时候通过os.environ.get()取出来就行了。

      这样开发人员本机测试的时候用的是自己本机的一套密码,生产环境部署的时候,用的是公司的公共账号和密码,这样就能增加安全性。os.environ是一个字典,是环境变量的字典。"PALM_JS_ADDRESS"是这个字典里的一个键,如果有这个键,返回对应的值,如果没有,则返回none

      

      打印一下os.environ的值,可以看到打印出一个字典

    1 print(os.environ)
    2 environ({'rvm_bin_path': '/usr/local/rvm/bin', 'TERM_PROGRAM': 'Apple_Terminal', 'SHELL': '/bin/bash', 'TERM': 'xterm-256color', 'TMPDIR': '/var/folders/m2/8_kj4c7s1jbdcc1brnnjs44c0000gn/T/', 'Apple_PubSub_Socket_Render': '/private/tmp/com.apple.launchd.x3UvvJIBTD/Render', 'TERM_PROGRAM_VERSION': '421.2', 'TERM_SESSION_ID': '33B6E14E-3659-4D94-B890-03275B7217F8', 'USER': 'chenpeisong', 'rvm_path': '/usr/local/rvm', 'SSH_AUTH_SOCK': '/private/tmp/com.apple.launchd.Dzg1yLGBXd/Listeners', 'rvm_prefix': '/usr/local', 'PATH': '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/rvm/bin', 'PWD': '/Users/chenpeisong', 'LANG': 'zh_CN.UTF-8', 'XPC_FLAGS': '0x0', 'XPC_SERVICE_NAME': '0', 'rvm_version': '1.29.9 (latest)', 'SHLVL': '1', 'HOME': '/Users/chenpeisong', 'LOGNAME': 'chenpeisong', 'SECURITYSESSIONID': '186a7', '_': '/usr/local/bin/python3', '__CF_USER_TEXT_ENCODING': '0x1F5:0x19:0x34', '__PYVENV_LAUNCHER__': '/usr/local/bin/python3'})
    3 
    4 >>> print(type(os.environ))
    5 <class 'os._Environ'>

      查看字典中具体某个key的值:

    #不使用get()方法
    >>> print(os.environ["rvm_bin_path"])
    /usr/local/rvm/bin
    
    #使用get()方法
    >>> print(os.environ.get("rvm_bin_path"))
    /usr/local/rvm/bin

     如果环境变量列表中不包含自己输入的变量名,可以给变量名赋值一个默认值

    >>> print(os.environ.get("rvm_bin_path1","23"))
    23

       这个方法是什么意思?

      __getitem__,首先这个方法在python中称为魔法方法,在创建实例时,会自动调用类中定义的方法__getitem__,输出在该方法返回的值

      具体使用方法参照这一篇,浅显易懂 python __setitem__(self)和__getitem__(self)

      cmd命令uptime是什么意思?

      参照 :https://blog.csdn.net/u014389734/article/details/79392440

      简单来说:

      望名生义,uptime 命令告诉你系统启动up了(运行了)多长时间。这是语法:

    uptime [options]

     

      多环境配置参照文档:

    https://blog.csdn.net/shykevin/article/details/90103355

  • 相关阅读:
    dom4j 解析 xml文件1
    java 简单的动态代理例子
    标识接口的作用 (转)
    JAVA servlet输出IE6下乱码
    java时间操作函数汇总
    IE支持getElementsByClassName方法
    女朋友问我 LB 是谁?
    人类高质量 Java 学习路线【一条龙版】
    程序员作图工具和技巧,你 get 了么?
    3 分钟了解 JSON Schema
  • 原文地址:https://www.cnblogs.com/kaerxifa/p/11268147.html
Copyright © 2011-2022 走看看