gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:59:49 26 4
gpt4 key购买 nike

背景

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com