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