想要实现的结果是:

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

python test.py dev

  实现代码:

  方式1 不用__getitem__方式:

 import os

 class OnlineConfig(object):
HOST="appapi.5i5j.com"
class ReleaseConfig(object):
HOST="appts.5i5j.com" mapping = {
"online":OnlineConfig,
"release":ReleaseConfig
} #根据脚本参数,来决定用那个环境配置
import sys
print(sys.argv) #在终端输入命令 python conf2.py online, 返回一个列表['conf2.py', 'online'] num = len(sys.argv)-1
if num<1 or num >1:
exit("参数错误,必须传环境变量!比如: python xx.py online|release")
env = sys.argv[1]
# print(env)
APP_ENV=os.environ.get("APP_ENV",env).lower()
print("APP_ENV:",APP_ENV)
config=mapping[APP_ENV]() if __name__ == "__main__":
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__方式:

 import os

 class Config(object):
'''
根据给定的环境,返回不同的host
''' mapping = {
'online': 'appapi.5i5j.com',
'release': 'appts.5i5j.com'
}
def __getitem__(self, envKey):
return self.mapping[envKey] #利用脚本参数输入,获得运行环境(envKey)
import sys
# print(sys.argv) #在终端输入命令 python conf2.py online, 返回一个列表['conf2.py', 'online'] #如果多传参数,或者没有传,退出程序,并给出错误提示
num = len(sys.argv)-1
if num<1 or num >1:
exit("参数错误,必须传环境变量!比如: python xx.py online|release")
env = sys.argv[1]
APP_ENV=os.environ.get("APP_ENV",env).lower()
# print(APP_ENV) if __name__ == "__main__": # 测试代码
config = Config()
print(config[APP_ENV])

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

 (build) Mac mini:build 5i5j$ python3 changeEnv.py release
appts.5i5j.com
(build) Mac mini:build 5i5j$ python3 changeEnv.py online
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的值,可以看到打印出一个字典

 print(os.environ)
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': '', 'rvm_version': '1.29.9 (latest)', 'SHLVL': '', 'HOME': '/Users/chenpeisong', 'LOGNAME': 'chenpeisong', 'SECURITYSESSIONID': '186a7', '_': '/usr/local/bin/python3', '__CF_USER_TEXT_ENCODING': '0x1F5:0x19:0x34', '__PYVENV_LAUNCHER__': '/usr/local/bin/python3'}) >>> print(type(os.environ))
<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

  这个方法是什么意思?

  __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

python之环境变量(测试环境可配置)的更多相关文章

  1. python环境变量的安装与配置

    安装最新的3.x(2.x如今已经不常见) 下图来源:百度(电脑已安装,不能重复) 一定要勾选"Add Python 3.6 to PATH".(如果没有勾选在安装完成后需要手动添加 ...

  2. 转 通过 spring 容器内建的 profile 功能实现开发环境、测试环境、生产环境配置自动切换

                                      软件开发的一般流程为工程师开发 -> 测试 -> 上线,因此就涉及到三个不同的环境,开发环境.测试环境以及生产环境,通常 ...

  3. PHPUnit使用教程——PHP环境变量+x-debug+composer+phpunit配置安装(超详细!)

    注意:Windows系统 一.提前入坑点:要求php5.6,7.0,7.1,不论使用集成版还是非集成版的小伙伴都要好好查看自己的php版本,个人的版本居然是5.5.X的,哭唧唧.不过别担心,爸爸教你升 ...

  4. angular 配置开发环境、测试环境、生产环境

    1. 配置开发环境.测试环境.生产环境 (1). environment.ts - 开发环境: 用于程序开发 (创建项目时自动生成) export const environment = { prod ...

  5. vue cli3配置开发环境、测试环境、生产(线上)环境

    cli3创建vue项目是精简版的少了build和config这2个文件,所以配置开发环境.测试环境.生产环境的话需要自己创建env文件. 需要注意2点: 1.cli2创建项目生成的config文件里的 ...

  6. linux环境下测试环境搭建

    一.linux环境下测试环境搭建过程简述: 1.前端后台代码未分离情况下: 主要步骤为:安装jdk,安装mysql,安装tomcat,将项目代码部署到tomcat/webapps/下. 2.前端后台代 ...

  7. 项目开发过程中什么是开发环境、测试环境、生产环境、UAT环境、仿真环境?

    项目开发过程中什么是开发环境.测试环境.生产环境.UAT环境.仿真环境? 最近在公司项目开发过程中总用到测试环境,生产环境和UAT环境等,然而我对环境什么的并不是很理解它的意思,一直处于开发阶段,出于 ...

  8. JNI环境变量——JNIEnv*的使用 &&配置jd环境变量

      如果没有配置环境变量,先配置环境变量,如下: 1.右键我的电脑——高级——环境变量——下面的系统变量 2.选择[新建系统变量]--弹出“新建系统变量”对话框,在“变量名”文本框输入“JAVA_HO ...

  9. Windows 7下配置JDK环境变量,JAVA环境变量配置,Tomcat服务器的使用

    参考来源: http://www.cnblogs.com/pannysp/archive/2012/03/07/2383364.html 1. 常识: 1.1 War包 War包一般是在进行Web开发 ...

  10. LINUX环境下SVN安装与配置(利用钩子同步开发环境与测试环境)

    安装采用YUM一键安装: 1.环境Centos 6.6 2.安装svnyum -y install subversion 3.配置 建立版本库目录mkdir /www/svndata svnserve ...

随机推荐

  1. HIbernate入门3

    HIbernate的一对多操作: 1. 创建实体类:一个Customer类(客户类)和一个LinkMan类(联系人),两者的关系为:一个客户中可能有多个联系人(关于一对多的实体类之间的关联,不做详细介 ...

  2. [2019杭电多校第一场][hdu6583]Typewriter(后缀自动机&&dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6583 大致题意是说可以花费p在字符串后添加一个任意字符,或者花费q在字符串后添加一个当前字符串的子串. ...

  3. Excel VBA在生成副本的工作表中插入本工作簿中的VBA模块代码

    即在工作簿中添加一个工作表,然后移出并存为新的工作簿,在移出前将本工作簿的一个模块的代码拷贝至新的工作簿.下面是关键代码: '===================================== ...

  4. 关于Python程序的运行方面,有什么手段能提升性能?

    1.使用多进程,充分利用机器的多核性能 2.对于性能影响较大的部分代码,可以使用C或C++编写 3.对于IO阻塞造成的性能影响,可以使用IO多路复用来解决 4.尽量使用Python的内建函数 5.尽量 ...

  5. Eureka注册中心高可用及常用配置项

    一.前言 前面已经简单的介绍了 Eureka 注册中心的使用以及查看.下面将继续进行 Eureka 的说明以及应用. 二.Eureka 的高可用搭建 在实际生产项目中,为了保证服务的可用性,连续性,一 ...

  6. jQuery学习总结01-选择器

    下面简单介绍一个常用的jQuery使用方法,其他详细的猛戳这里 一.选择器 1.parent > child 说明:在给定父类的情况下匹配所有的子类 示例: 描述:匹配表单中所有的的子级inpu ...

  7. WEB服务动静结合

    基本介绍 1)WEB服务仅能处理静态请求,如果处理动态请求则需要对应的动态资源服务软件,即:应用程序服务软件 2)常见的应用服务软件有:PHP.Java.Python等 3)问题:WEB服务如何与外部 ...

  8. Linux下NFS服务器的搭建与配置(转)

    一.NFS服务简介 NFS 就是 Network FileSystem 的缩写,最早之前是由sun 这家公司所发展出来的. 它最大的功能就是可以透过网络,让不同的机器.不同的操作系统.可以彼此分享个别 ...

  9. 05XML

    1.XML入门 1.1 引入 HTML, 超文本标记语言. html语言语法是很松散的! 1)标签不区分大小写的! 2)标签可以不匹配的. 由w3c组织,针对html的语法缺陷,去设计了另一门,叫xm ...

  10. X-MAS CTF 2018 - Crypto - Hanukkah

    参考链接 https://ctftime.org/task/7321 https://github.com/VoidHack/write-ups/tree/master/X-MAS%20CTF%202 ...