栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

用于从Python修改Windows环境变量的界面

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用于从Python修改Windows环境变量的界面

使用setx的缺点很少,尤其是当您尝试附加到环境变量(例如setx PATH%Path%; C:
mypath)时,这将在每次运行时重复附加到路径中,这可能是一个问题。更糟糕的是,它无法区分机器路径(存储在HKEY_LOCAL_MACHINE中)和用户路径(存储在HKEY_CURRENT_USER中)。您在命令提示符处看到的环境变量由这两个值的串联组成。因此,在调用setx之​​前:

user PATH == umachine PATH == m%PATH% == m;u> setx PATH %PATH%;newCalling setx sets the USER path by default, hence now:user PATH == m;u;newmachine PATH == m%PATH% == m;m;u;new

每次调用setx追加到PATH时,系统路径都会不可避免地在%PATH%环境变量中重复。这些更改是永久性的,永远不会通过重新启动进行重置,因此会在计算机的整个生命周期内不断累积。

试图在DOS中弥补这一点超出了我的能力范围。所以我转向了Python。我今天想出的解决方案,是通过调整注册表来设置环境变量,包括追加到PATH而不引入重复项,如下所示:

from os import system, environimport win32confrom win32gui import SendMessagefrom _winreg import (    CloseKey, OpenKey, QueryValueEx, SetValueEx,    HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE,    KEY_ALL_ACCESS, KEY_READ, REG_EXPAND_SZ, REG_SZ)def env_keys(user=True):    if user:        root = HKEY_CURRENT_USER        subkey = 'Environment'    else:        root = HKEY_LOCAL_MACHINE        subkey = r'SYSTEMCurrentControlSetControlSession ManagerEnvironment'    return root, subkeydef get_env(name, user=True):    root, subkey = env_keys(user)    key = OpenKey(root, subkey, 0, KEY_READ)    try:        value, _ = QueryValueEx(key, name)    except WindowsError:        return ''    return valuedef set_env(name, value):    key = OpenKey(HKEY_CURRENT_USER, 'Environment', 0, KEY_ALL_ACCESS)    SetValueEx(key, name, 0, REG_EXPAND_SZ, value)    CloseKey(key)    SendMessage(        win32con.HWND_BROADCAST, win32con.WM_SETTINGCHANGE, 0, 'Environment')def remove(paths, value):    while value in paths:        paths.remove(value)def unique(paths):    unique = []    for value in paths:        if value not in unique: unique.append(value)    return uniquedef prepend_env(name, values):    for value in values:        paths = get_env(name).split(';')        remove(paths, '')        paths = unique(paths)        remove(paths, value)        paths.insert(0, value)        set_env(name, ';'.join(paths))def prepend_env_pathext(values):    prepend_env('PathExt_User', values)    pathext = ';'.join([        get_env('PathExt_User'),        get_env('PathExt', user=False)    ])    set_env('PathExt', pathext)set_env('Home', '%HomeDrive%%HomePath%')set_env('Docs', '%HomeDrive%%HomePath%docs')set_env('prompt', '$P$_$G$S')prepend_env('Path', [    r'%SystemDrive%cygwinbin', # Add cygwin binaries to path    r'%HomeDrive%%HomePath%bin', # shortcuts and 'pass-through' bat files    r'%HomeDrive%%HomePath%docsbinmswin', # copies of standalone executables])# allow running of these filetypes without having to type the extensionprepend_env_pathext(['.lnk', '.exe.lnk', '.py'])

它不会影响当前进程或父Shell,但会影响运行后打开的所有cmd窗口,而无需重新启动,并且可以安全地进行编辑和重新运行多次,而不会引入任何重复项。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/641526.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号