最近在學Django,看到代碼中有用os.environ修改 環境變量,但是在Windows中查看,卻沒有發現修改后的環境變量。遂在網上查找相關資料,找到這么一篇文章:
os.environ and os.putenv in Python
用Python Shell設置或獲取環境變量的方法:
一、設置系統環境變量
1、os.environ['環境變量名稱']='環境變量值' #其中key和value均為string類型
2、os.putenv('環境變量名稱', '環境變量值')
二、獲取系統環境變量
1、os.environ['環境變量名稱']
2、os.getenv('環境變量名稱')
以上方法,推薦用os.environ,因為使用os.putenv()並不會真正改變os.environ字典里面的環境變量,即某些平台無效,但是使用os.environ有一個潛在的隱患:在一些平台上,包括FreeBSD和Mac OS X,修改environ會導致內存泄露。詳情見Python API。
我們設置的環境變量只存在於當前的python shell中(設置成功后用print os.environ['環境變量名稱']或printos.getenv('環境變量名稱') 查看)。也就是說,比如Windows環境下,在"我的電腦"——“屬性”——“高級系統設置”——"高級"——"環境變量"中找不到剛才設置成功的環境變量。為什么會這樣呢,如何用Python真正設置環境變量?
如果你所在的開發環境是windows的操作系統,import _winreg模塊將環境變量寫入注冊表,再廣播WM_SETTINGCHANGE消息,可參考實例;如果你所在的開發環境是Linux的操作系統,使用linux命令,在bash_profile文件中添加環境變量后,使其生效即可。
以下是網址中給出的參考代碼:
1 import _winreg as winreg 2 import ctypes 3 4 ENV_HTTP_PROXY = u'http://87.254.212.121:8080' 5 6 7 class Registry(object): 8 def __init__(self, key_location, key_path): 9 self.reg_key = winreg.OpenKey(key_location, key_path, 0, winreg.KEY_ALL_ACCESS) 10 11 def set_key(self, name, value): 12 try: 13 _, reg_type = winreg.QueryValueEx(self.reg_key, name) 14 except WindowsError: 15 # If the value does not exists yet, we (guess) use a string as the 16 # reg_type 17 reg_type = winreg.REG_SZ 18 winreg.SetValueEx(self.reg_key, name, 0, reg_type, value) 19 20 def delete_key(self, name): 21 try: 22 winreg.DeleteValue(self.reg_key, name) 23 except WindowsError: 24 # Ignores if the key value doesn't exists 25 pass 26 27 28 29 class EnvironmentVariables(Registry): 30 """ 31 Configures the HTTP_PROXY environment variable, it's used by the PIP proxy 32 """ 33 34 def __init__(self): 35 super(EnvironmentVariables, self).__init__(winreg.HKEY_LOCAL_MACHINE, 36 r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment') 37 38 def on(self): 39 self.set_key('HTTP_PROXY', ENV_HTTP_PROXY) 40 self.refresh() 41 42 def off(self): 43 self.delete_key('HTTP_PROXY') 44 self.refresh() 45 46 def refresh(self): 47 HWND_BROADCAST = 0xFFFF 48 WM_SETTINGCHANGE = 0x1A 49 50 SMTO_ABORTIFHUNG = 0x0002 51 52 result = ctypes.c_long() 53 SendMessageTimeoutW = ctypes.windll.user32.SendMessageTimeoutW 54 SendMessageTimeoutW(HWND_BROADCAST, WM_SETTINGCHANGE, 0, u'Environment', SMTO_ABORTIFHUNG, 5000, ctypes.byref(result));