此代码段非常标准:(您会在许多网站上找到它)
rc, dwReturnValue = win32gui.SendMessageTimeout(win32con.HWND_BROADCAST, win32con.WM_SETTINGCHANGE, 0, "Environment", win32con.SMTO_ABORTIFHUNG, 5000 )
在一台机器上,它删除了大部分环境变量,但不是全部:这些变量被删除:(和其他)
Path
PYTHONPATH
VS100COMNTOOLS
windir
XEDK
当我说已删除时,我的意思是原始 shell 具有完整的环境,但所有后续环境 shell 都没有这些环境变量,至少可以说,这“有点”麻烦。
我已经在至少 4 台其他机器上尝试过这段代码,没有任何问题。该代码完美运行。
在一台有问题的机器上,注销/登录似乎可以解决问题,(并恢复丢失的环境变量)
我在全能的 google 上进行了很多研究,并没有发现 win32gui.SendMessageTimeout 方法的错误。只发现未正确调用该方法的人的线程。(也许这个线程会加入这些行列!:))
我一直在运行 spy++(我是 spy++ 菜鸟),可以看到 WM_SETTINGCHANGE 消息被有问题的机器上的几个不同窗口正确接收。
print str(rc),"<- return code"
print str(dwReturnValue), "<- return value"
产量
1 <- return code
0 <- return value
这是我的设置:
- 操作系统 - Windows 7
- 蟒蛇2.7.1
- 赛温 19.5
进程是一个批处理文件(install.bat)(这会设置 %CYGWIN_ROOT%)
(...)
:BASH_INSTALL_SCRIPT
::write paths file that will be used to modify system paths
set PATH=%CYGWIN_ROOT%\bin;%PATH%
::call bash install sequence
"%BASH_EXE%" install.sh %CYGWIN_ROOT%\bin %*
install.sh 片段:
function setCygwinPath {
# Install script of Cygwin set CYGWIN_ROOT in current env variables.
setEnvVar "CYGWIN_PATH" $CYGWIN_ROOT
}
function setEnvVar {
"$PythonRoot/python.exe" ../utils/${project}/setEnvVar.py $1 $2
(...) }
设置环境变量.py
from install.installUtils import *
setUserEnvVar( sys.argv[1], sys.argv[2])
installUtils.py
def setUserEnvVar( varName, content, type=wreg.REG_EXPAND_SZ, override=0 ):
""" Set the specified environment variable """
setEnvVarAndBroadcast( wreg.HKEY_CURRENT_USER, getUserEnvKey(), varName, content, type, override )
def setEnvVarAndBroadcast( domain, regKey, varName, content, type=wreg.REG_EXPAND_SZ, override=0 ):
""" Set an environment variable and broadcast to opened application """
if override == 0 :
# If the variable exist reuse its current type
varInfo = getEnvVarEx( domain, regKey, varName )
if varInfo[0] <> "" :
type = varInfo[1]
key = wreg.OpenKey(domain, regKey, 0, wreg.KEY_WRITE )
wreg.SetValueEx( key, varName, 0, type, content)
wreg.CloseKey( key )
HWND_BROADCAST = 0xffff
WM_SETTINGCHANGE = 0x001A
SMTO_ABORTIFHUNG = 0x0002
rc, dwReturnValue = win32gui.SendMessageTimeout(win32con.HWND_BROADCAST, win32con.WM_SETTINGCHANGE, 0, "Environment", win32con.SMTO_ABORTIFHUNG, 5000 )
我已经完全隔离了调用 win32gui.SendMessageTimeout 是破坏机器环境变量的原因。
这段代码以前在这台机器上工作,直到一周前(不知道发生了什么变化;我什么也不说,
问题:这似乎有点像一个漏洞......我错了吗?我不太确定要调查什么,所以我会欢迎一个解决方案(显然),但即使是调查的想法也会受到欢迎。我在有问题的机器上只有 win32gui.pyd (没有来源)。
机器从 73 个环境变量变为 46 个( c:> set )。其中很多是用户安装的应用程序,但有些是系统(如 PATH、windir)。