为什么python';s win32gui.SendMessageTimeout失败并删除大部分环境变量?

为什么python';s win32gui.SendMessageTimeout失败并删除大部分环境变量?,python,bash,windows-7,operating-system,environment-variables,Python,Bash,Windows 7,Operating System,Environment Variables,这段代码非常标准:(在许多网站上都可以找到) 在一台机器上,它删除了大部分(但不是全部)环境变量: 这些变量被删除:(和其他变量) 当我说deleted时,我的意思是原始shell有一个完整的环境,但是所有后续的环境shell都没有这些环境变量,至少可以说,这“有点”麻烦 我已经在至少4台其他机器上试过这段代码,没有问题。代码工作得很好 在一台有问题的机器上,注销/登录似乎可以解决问题,(并恢复丢失的环境变量) 我在万能的google上做了很多研究,没有发现win32gui.SendMessag

这段代码非常标准:(在许多网站上都可以找到)

在一台机器上,它删除了大部分(但不是全部)环境变量: 这些变量被删除:(和其他变量)

当我说deleted时,我的意思是原始shell有一个完整的环境,但是所有后续的环境shell都没有这些环境变量,至少可以说,这“有点”麻烦

我已经在至少4台其他机器上试过这段代码,没有问题。代码工作得很好

在一台有问题的机器上,注销/登录似乎可以解决问题,(并恢复丢失的环境变量)

我在万能的google上做了很多研究,没有发现win32gui.SendMessageTimeout方法的错误 仅在未正确调用该方法的人员上找到线程。(也许此线程将加入这些行列!:)

我一直在运行spy++(我是spy++noob),可以看到问题机器上的几个不同窗口正确地接收到WM_SETTINGCHANGE消息

print str(rc),"<- return code"
print str(dwReturnValue), "<- return value"
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
(...)    }
setEnvVar.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 )
def setUserEnvVar(varName,content,type=wreg.REG\u EXPAND\u SZ,override=0):
“”“设置指定的环境变量”“”
setEnvVarAndBroadcast(wreg.HKEY_CURRENT_USER,getUserEnvKey(),varName,content,type,override)
def setEnvVarAndBroadcast(域、注册表项、变量名、内容、类型=wreg.REG\u EXPAND\u SZ、覆盖=0):
“”“设置环境变量并广播到打开的应用程序”“”
如果覆盖==0:
#如果变量存在,请重用其当前类型
varInfo=getEnvVarEx(域、regKey、varName)
如果varInfo[0]“”:
类型=VariInfo[1]
key=wreg.OpenKey(域,regKey,0,wreg.key\u写)
wreg.SetValueEx(键,变量名,0,类型,内容)
扳手关闭键(钥匙)
HWND_广播=0xffff
WM_设置更改=0x001A
SMTO_fartifhung=0x0002
rc,dwReturnValue=win32gui.SendMessageTimeout(win32con.HWND_广播,win32con.WM_设置更改,0,“环境”,win32con.SMTO_中止,5000)
我已经明确指出,调用win32gui.SendMessageTimeout会中断机器的环境变量

直到一周前,这段代码还在这台机器上运行(不知道发生了什么变化;我什么也不说

问题: 这似乎是一种剥削……我错了吗? 我真的不确定要调查什么,所以我欢迎一个解决方案(显然),但即使是一个调查的想法也会受到欢迎。我在讨论的机器上只有win32gui.pyd(没有来源)

这台机器从73个环境变量变为46个(c:>set)。其中许多是用户安装的应用程序,但有些是系统(如PATH、windir)

(...)
: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 %*
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
(...)    }
from install.installUtils import *
setUserEnvVar( sys.argv[1], sys.argv[2])
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 )