python - 以编程方式刷新 PATH 中的环境变量引用 (Windows 10)

标签 python windows environment-variables windows-10 environment

背景

我有一个 Python 脚本,它将环境变量设置到注册表中,然后 broadcasts an update using the WinSDK告诉系统变量已更新。这与 setx 和手动环境变量 UI 的行为类似。这在 Windows 7 中效果很好。

但是,在 Windows 10 中,它几乎可以工作。

这是我的问题

  1. 我设置了一个环境变量 (XXX = c:\my_dir)
  2. 然后,我通过注册表将对 XXX 的引用插入到 PATH 变量中。我确保使用 REG_EXPAND_SZ 类型。
  3. 然后我广播更新。
  4. 当我重新启动新的 cmd.exe shell 时,我可以看到新变量 XXX(回显 %XXX%),但是,当我查看 PATH 时,对 XXX 的引用未正确展开。
  5. 为了保持路径更新,我需要手动进入环境变量 UI 并“编辑”路径,或者需要登录并注销。

奇怪的是,这只影响 PATH。如果我添加对另一个变量(例如 PYTHONPATH)的引用,一切似乎都会按预期工作。

我尝试过的

  • 终止 explorer.exe 任务树并重新启动
  • 对 setx 进行子处理是可行的,但我想将我的实现保留在纯 Python 中。

更新环境代码

import ctypes

def update_environment():
    """Uses ctypes to send a message to all windows that the environment has
    been updated. This has the same effect as pressing the 'OK' button in the
    windows environment variables dialog.

    References:
        https://support.microsoft.com/en-us/kb/104011"""
    wm_settingchange = 0x001A
    hwnd_broadcast = wintypes.HWND(0xffff)
    smto_abortifhung = 0x0002
    env_message = ctypes.create_unicode_buffer('Environment')
    result = ctypes.windll.user32.SendMessageTimeoutW(hwnd_broadcast,
                                                      wm_settingchange,
                                                      0,
                                                      env_message,
                                                      smto_abortifhung,
                                                      5000,
                                                      0)
    return result

问题

还有其他已知方法可以强制 Windows 10 刷新环境(特别是 PATH 中的环境引用)吗?

最佳答案

我搞乱了一些事情,发现了(我认为)问题所在。

基本上,我设置的每个注册表项都是 REG_EXPAND_SZ 类型。在 Windows 7 中,这似乎工作得很好。但是,这不会强制在 Windows 10 中重新扩展我的变量,除非我的 XXX 键设置为 REG_SZ。如果我这样做,那么 Windows 将正确更新变量引用。

关于python - 以编程方式刷新 PATH 中的环境变量引用 (Windows 10),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45202732/

相关文章:

python - python 3.2中的奇怪错误

python - 灵敏度特异性图 python

go - 跨文件使用环境变量 - GOPATH

python - 如何将变量值替换为 sympy python 中的符号矩阵?

python时间字符串与格式不匹配

c++ - 跨进程 COM 编码(marshal)拆收器 : reduce number of copies for large arrays

windows - 在 BASH windows 上默认设置一个目录

java - Tomcat 9 获取 BindException 地址已在使用中

年月的 Windows 环境变量

batch-file - 批处理 - 如何在启用了启用延迟扩展的情况下设置并保留下一个命令的变量值