我該如何永久添加系統環境變量「路徑」的路徑?如何添加和刪除系統環境變量「PATH」?
我想只添加路徑,如果它不存在。
另外我想刪除包含的文件夾名稱,如\myprogram
無論是所有路徑:
C:\path\to\myprogram\dist;
或D:\another\path\to\myprogram\dist;
我該如何永久添加系統環境變量「路徑」的路徑?如何添加和刪除系統環境變量「PATH」?
我想只添加路徑,如果它不存在。
另外我想刪除包含的文件夾名稱,如\myprogram
無論是所有路徑:
C:\path\to\myprogram\dist;
或D:\another\path\to\myprogram\dist;
import _winreg as reg
import win32gui
import win32con
# read the value
key = reg.OpenKey(reg.HKEY_CURRENT_USER, 'Environment', 0, reg.KEY_ALL_ACCESS)
# use this if you need to modify the system variable and if you have admin privileges
#key = reg.OpenKey(reg.HKEY_LOCAL_MACHINE, r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 0, reg.KEY_ALL_ACCESS)
try
value, _ = reg.QueryValueEx(key, 'PATH')
except WindowsError:
# in case the PATH variable is undefined
value = ''
# modify it
value = ';'.join([s for s in value.split(';') if not r'\myprogram' in s])
# write it back
reg.SetValueEx(key, 'PATH', 0, reg.REG_EXPAND_SZ, value)
reg.CloseKey(key)
# notify the system about the changes
win32gui.SendMessage(win32con.HWND_BROADCAST, win32con.WM_SETTINGCHANGE, 0, 'Environment')
我從你的問題,你有興趣做這個路徑推斷在Windows平臺上。
的documentation描述的過程:
以編程方式添加或修改系統環境變量,把它們添加到HKEY_LOCAL_MACHINE \系統\ CurrentControlSet \控制\會話管理\環境的註冊表項,然後廣播用WM_SETTINGCHANGE消息lParam設置爲字符串「Environment」。這使應用程序(如shell)能夠獲取更新。
您應該檢查os.environ。這是一個字典,可以直接或通過os.putenv:
將名爲varname的環境變量設置爲字符串值。 對環境所做的更改會影響以 os.system(),popen()或fork()和execv()開頭的子流程。
因此:
>>> import os
>>> os.environ["PATH"] = path_old + ":/tmp/hallo"
>>> os.environ["PATH"]
'/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/vendor_perl:/usr/bin/core_perl:/tmp/hallo'
[更新]
根據to this answer你可以讓他們通過Windows註冊表持久
您不能「神奇地」使用Windows註冊表對「os.environ」進行持久更改。你必須在那裏寫一個具體的價值。你不需要修改'os.environ'來執行此操作。而且,你不需要讀取它:'os.environ [「PATH」]的值由兩個值組成:用戶PATH和系統PATH,它們存儲在不同的註冊表項中。您應該讀取相應的註冊表值。 – utapyngo
這裏的東西,你想要做什麼是類似於jaraco.windows項目中的代碼。就像它一樣,只使用內置的Python模塊 - 因此不需要先下載並安裝pywin32擴展。 加上Python 2.6+和3.x兼容,並支持Unicode環境變量和值(在這種情況下爲目錄路徑)。
請注意,需要Windows管理員權限才能更改永久系統級環境變量。
import ctypes
from ctypes.wintypes import HWND, UINT, WPARAM, LPARAM, LPVOID
LRESULT = LPARAM # synonymous
import os
import sys
try:
import winreg
unicode = str
except ImportError:
import _winreg as winreg # Python 2.x
class Environment(object):
path = r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment'
hklm = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE)
key = winreg.OpenKey(hklm, path, 0, winreg.KEY_READ | winreg.KEY_WRITE)
SendMessage = ctypes.windll.user32.SendMessageW
SendMessage.argtypes = HWND, UINT, WPARAM, LPVOID
SendMessage.restype = LRESULT
HWND_BROADCAST = 0xFFFF
WM_SETTINGCHANGE = 0x1A
NO_DEFAULT_PROVIDED = object()
def get(self, name, default=NO_DEFAULT_PROVIDED):
try:
value = winreg.QueryValueEx(self.key, name)[0]
except WindowsError:
if default is self.NO_DEFAULT_PROVIDED:
raise ValueError("No such registry key", name)
value = default
return value
def set(self, name, value):
if value:
winreg.SetValueEx(self.key, name, 0, winreg.REG_EXPAND_SZ, value)
else:
winreg.DeleteValue(self.key, name)
self.notify()
def notify(self):
self.SendMessage(self.HWND_BROADCAST, self.WM_SETTINGCHANGE, 0, u'Environment')
Environment = Environment() # singletion - create instance
PATH_VAR = 'PATH'
def append_path_envvar(addpath):
def canonical(path):
path = unicode(path.upper().rstrip(os.sep))
return winreg.ExpandEnvironmentStrings(path) # Requires Python 2.6+
canpath = canonical(addpath)
curpath = Environment.get(PATH_VAR, '')
if not any(canpath == subpath
for subpath in canonical(curpath).split(os.pathsep)):
Environment.set(PATH_VAR, os.pathsep.join((curpath, addpath)))
def remove_envvar_path(folder):
""" Remove *all* paths in PATH_VAR that contain the folder path. """
curpath = Environment.get(PATH_VAR, '')
folder = folder.upper()
keepers = [subpath for subpath in curpath.split(os.pathsep)
if folder not in subpath.upper()]
Environment.set(PATH_VAR, os.pathsep.join(keepers))
使用範例:
print(Environment.get('path'))
append_path_envvar(r'C:\path\to\myprogram\dist')
append_path_envvar(r'D:\another\path\to\myprogram\dist')
print(Environment.get('path'))
remove_envvar_path(r'\myprogram') # remove *both* added paths
print(Environment.get('path'))
輝煌!它真的是以最好的方式回答這個問題。爲我節省了2個小時。 –
@瓦西里:不客氣。注意如果您有興趣,我只做了一些小改進。 – martineau
你知道任何Python庫或簡單腳本接受參數併爲你做的工作? –
win32xxx可以發送消息,而winreg則是註冊表 –