这里是我创建的一个解决方案。它将检查路径是否已经存在,如果不存在,则会将其写入当前用户和计算机的注册表中。
我已经测试过,当前进程不会拥有更新后的环境变量,但是从运行命令启动的新命令行将会被更新。
请注意,当创建新窗口时,它将具有更新后的路径值。
def AppendWindowsPath(path):
def AddPathInRegistry(HKEY, reg_path, new_path):
reg = None
key = None
try:
reg = ConnectRegistry(None, HKEY)
key = OpenKey(reg, reg_path, 0, KEY_ALL_ACCESS)
path_string, type_id = QueryValueEx(key, 'PATH')
path_list = [f.strip("\r\n") for f in path_string.split(';') if f]
if new_path in path_list:
print(new_path + " is already in %PATH%")
return "ALREADY_IN_ENVIRONMENT"
print("Adding " + new_path + " to %PATH%")
SetValueEx(key, 'PATH', 0, REG_EXPAND_SZ, path_string + ";" + new_path)
return "UPDATED_PATH"
except Exception as e:
print("ERROR while executing registry edit with " + str(HKEY) + "/" + reg_path)
return "ERROR"
finally:
if key: CloseKey(key)
if reg: CloseKey(reg)
result_machine = \
AddPathInRegistry(HKEY_LOCAL_MACHINE,
r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment',
path)
result_user = \
AddPathInRegistry(HKEY_CURRENT_USER, r'Environment', path)
if ("UPDATED_PATH" in result_machine) or ("UPDATED_PATH" in result_user):
win32gui.SendMessage(win32con.HWND_BROADCAST, win32con.WM_SETTINGCHANGE, 0, 'Environment')
subprocess.Popen
或其中一个高级函数,例如subprocess.check_output
,并使用其env
选项将修改后的环境传递给子进程。例如:environ = os.environ.copy();
environ['PATH'] += os.pathsep + os.pathsep.join([r'lib\testfolder1', r'lib\testfolder2']);
p = subprocess.Popen([exepath, arg1, arg2, ...], env=environ)
。 - Eryk Sun