想要實現的結果是:
執行腳本時,帶一個參數,由這個參數來決定測試環境(開發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]
多環境配置參照文檔: