python修改windows环境变量


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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM