最近在学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));
