这个代码片段非常标准:(你可以在许多网站上找到它)
rc, dwReturnValue = win32gui.SendMessageTimeout(win32con.HWND_BROADCAST, win32con.WM_SETTINGCHANGE, 0, "Environment", win32con.SMTO_ABORTIFHUNG, 5000 )
在一台机器上,它会删除大部分(但不是全部)环境变量: 这些变量将被删除:(和其他变量)
^{pr2}$当我说deleted时,我的意思是原始shell有一个完整的环境,但是所有后续的环境shell都没有这些环境变量,至少可以说,这“有点”麻烦。在
我已经在至少4台其他机器上尝试过这个代码,没有问题。代码运行得很好。在
在一台有问题的机器上,注销/登录似乎可以解决问题(并恢复丢失的env vars)
我在万能的google上做了很多研究,没有发现win32方法的错误gui.SendMessage超时 只在未正确调用方法的人上找到线程。(也许这条线会加入这些行列!:))
我一直在运行spy++(我是一个spy++noob),可以看到WM_SETTINGCHANGE消息被有问题的机器上的几个不同窗口正确接收。在
print str(rc),"<- return code"
print str(dwReturnValue), "<- return value"
收益率
1 <- return code
0 <- return value
以下是我的设置:
过程是 批处理文件(批处理文件)(设置%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 %*
在安装.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.SendMessage超时是什么破坏了机器的环境变量。在
这段代码之前在这台机器上运行,直到一周前(不知道发生了什么变化;我什么也不说
问题: 这似乎是一种剥削。。。。。。我错了吗? 我真的不知道该调查什么,所以我欢迎一个解决方案(显然),但即使是一个调查的想法也会受到欢迎。我只有32分图形用户界面.pyd(没有来源)在有问题的机器上。在
机器从73个环境变量变为46个(c:>;set)。其中很多是用户安装的应用程序,但有些是系统(如PATH、windir)。在
目前没有回答
相关问题 更多 >
编程相关推荐