# -*- coding: utf-8 -*-
#
# Copyright © 2009-2010 Pierre Raybaut
# Licensed under the terms of the MIT License
# (see spyderlib/__init__.py for details)
"""
Environment variable utilities
"""
from spyderlib.qt.QtGui import QDialog, QMessageBox
import os
# Local imports
from spyderlib.baseconfig import _
from spyderlib.widgets.dicteditor import DictEditor
def envdict2listdict(envdict):
"""Dict --> Dict of lists"""
sep = os.path.pathsep
for key in envdict:
if sep in envdict[key]:
envdict[key] = [path.strip() for path in envdict[key].split(sep)]
return envdict
def listdict2envdict(listdict):
"""Dict of lists --> Dict"""
for key in listdict:
if isinstance(listdict[key], list):
listdict[key] = os.path.pathsep.join(listdict[key])
return listdict
class RemoteEnvDialog(DictEditor):
"""Remote process environment variables Dialog"""
def __init__(self, get_environ_func, set_environ_func, parent=None):
super(RemoteEnvDialog, self).__init__(parent)
self.setup(envdict2listdict(get_environ_func()),
title="os.environ", width=600, icon='environ.png')
self.set_environ = set_environ_func
def accept(self):
"""Reimplement Qt method"""
self.set_environ(listdict2envdict(self.get_value()))
QDialog.accept(self)
class EnvDialog(RemoteEnvDialog):
"""Environment variables Dialog"""
def __init__(self):
def get_environ_func():
return dict(os.environ)
def set_environ_func(env):
os.environ = env
RemoteEnvDialog.__init__(self, get_environ_func, set_environ_func)
# For Windows only
try:
from spyderlib.py3compat import winreg
def get_user_env():
"""Return HKCU (current user) environment variables"""
reg = dict()
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Environment")
for index in range(0, winreg.QueryInfoKey(key)[1]):
try:
value = winreg.EnumValue(key, index)
reg[value[0]] = value[1]
except:
break
return envdict2listdict(reg)
def set_user_env(reg, parent=None):
"""Set HKCU (current user) environment variables"""
reg = listdict2envdict(reg)
types = dict()
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Environment")
for name in reg:
try:
_x, types[name] = winreg.QueryValueEx(key, name)
except WindowsError:
types[name] = winreg.REG_EXPAND_SZ
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Environment", 0,
winreg.KEY_SET_VALUE)
for name in reg:
winreg.SetValueEx(key, name, 0, types[name], reg[name])
try:
from win32gui import SendMessageTimeout
from win32con import (HWND_BROADCAST, WM_SETTINGCHANGE,
SMTO_ABORTIFHUNG)
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
"Environment", SMTO_ABORTIFHUNG, 5000)
except ImportError:
QMessageBox.warning(parent, _("Warning"),
_("Module pywin32 was not found.
"
"Please restart this Windows session "
"(not the computer) for changes to take effect."))
class WinUserEnvDialog(DictEditor):
"""Windows User Environment Variables Editor"""
def __init__(self, parent=None):
super(WinUserEnvDialog, self).__init__(parent)
self.setup(get_user_env(),
title="HKEY_CURRENT_USER\Environment", width=600)
if parent is None:
parent = self
QMessageBox.warning(parent, _("Warning"),
_("If you accept changes, "
"this will modify the current user environment "
"variables directly in Windows registry. "
"Use it with precautions, at your own risks.
"
"
Note that for changes to take effect, you will "
"need to restart the parent process of this applica"
"tion (simply restart Spyder if you have executed it "
"from a Windows shortcut, otherwise restart any "
"application from which you may have executed it, "
"like Python(x,y) Home for example)"))
def accept(self):
"""Reimplement Qt method"""
set_user_env( listdict2envdict(self.get_value()), parent=self )
QDialog.accept(self)
except ImportError:
pass
def main():
"""Run Windows environment variable editor"""
from spyderlib.utils.qthelpers import qapplication
app = qapplication()
dialog = WinUserEnvDialog()
dialog.show()
app.exec_()
if __name__ == "__main__":
main()