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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM