このコードスニペットは非常に標準的です:(多くのサイトで見つかります)
rc, dwReturnValue = win32gui.SendMessageTimeout(win32con.HWND_BROADCAST, win32con.WM_SETTINGCHANGE, 0, "Environment", win32con.SMTO_ABORTIFHUNG, 5000 )
1台のマシンでは、すべてではありませんが、ほとんどの環境変数が削除されます。これらの変数は削除されます:(およびその他)
Path
PYTHONPATH
VS100COMNTOOLS
windir
XEDK
削除されたと言うとき、つまり、元のシェルには無傷の環境がありますが、後続のすべての環境シェルにはこれらの環境変数がありません。控えめに言っても、「やや」面倒です。
このコードを少なくとも4台の他のマシンで試しましたが、問題はありません。コードは完全に機能します。
問題のある1台のマシンでは、ログオフ/ログオンで問題が解決したようです(不足しているenv変数を元に戻します)
私は全能のグーグルで多くのことを研究しましたが、メソッドwin32gui.SendMessageTimeoutのエラーについては何も見つかりませんでした。メソッドを正しく呼び出していない人のスレッドのみが見つかりました。(おそらく、このスレッドはそれらのランクに加わります!:))
私はspy++(私はspy ++ noobです)を実行していて、問題のあるマシンのいくつかの異なるウィンドウでWM_SETTINGCHANGEメッセージが正しく受信されていることを確認できます。
print str(rc),"<- return code"
print str(dwReturnValue), "<- return value"
収量
1 <- return code
0 <- return value
これが私の設定です:
- OS-Windows 7
- Python 2.7.1
- cywin 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
(...) }
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 )
私は、win32gui.SendMessageTimeoutの呼び出しが、マシンの環境変数を混乱させるものであることを完全に分離しました。
このコードは、1週間前まで、以前はこのマシンで機能していました(何が変更されたかはわかりません。何も言わないでしょうが、
質問:これはちょっとした悪用のようです......私は間違っていますか?もう何を調べたらいいのかわからないので、(もちろん)解決策を歓迎しますが、調査のアイデアも歓迎します。問題のマシンにはwin32gui.pyd(ソースなし)しかありません。
マシンは73の環境変数から46になります(c:> set)。それらの多くはユーザーがインストールしたアプリケーションですが、一部はシステム(PATH、windirなど)です。