def LoadPythonInterpreters(self): if sysutils.isWindows(): import _winreg ROOT_KEY_LIST = [ _winreg.HKEY_LOCAL_MACHINE, _winreg.HKEY_CURRENT_USER ] ROOT_KEY_NAMES = ['LOCAL_MACHINE', 'CURRENT_USER'] for k, root_key in enumerate(ROOT_KEY_LIST): try: open_key = _winreg.OpenKey(root_key, r"SOFTWARE\Python\Pythoncore") countkey = _winreg.QueryInfoKey(open_key)[0] keylist = [] for i in range(int(countkey)): name = _winreg.EnumKey(open_key, i) try: child_key = _winreg.OpenKey( root_key, r"SOFTWARE\Python\Pythoncore\%s" % name) install_path = _winreg.QueryValue( child_key, "InstallPath") interpreter = Interpreter.PythonInterpreter( name, os.path.join( install_path, Interpreter. PythonInterpreter.CONSOLE_EXECUTABLE_NAME)) if not interpreter.IsValidInterpreter: app_debugLogger.error( "interpreter name %s path %s,version %s is not a valid interpreter", interpreter.Name, interpreter.Path, interpreter.Version) continue self.interpreters.insert(0, interpreter) app_debugLogger.info( "load python interpreter from regkey success,path is %s,version is %s", interpreter.Path, interpreter.Version) help_key = _winreg.OpenKey(child_key, "Help") help_path = _winreg.QueryValue( help_key, "Main Python Documentation") interpreter.HelpPath = help_path app_debugLogger.info( "interpreter %s,help path is %s", interpreter.Name, interpreter.HelpPath) except Exception as e: app_debugLogger.error( "read python child regkey %s\\xxx\\%s error:%s", ROOT_KEY_NAMES[k], name, e) continue except Exception as e: app_debugLogger.error( "load python interpreter from regkey %s error:%s", ROOT_KEY_NAMES[k], e) continue else: executable_path = sys.executable install_path = os.path.dirname(executable_path) interpreter = Interpreter.PythonInterpreter( "default", executable_path) self.interpreters.append(interpreter)
def AddPythonInterpreter(self, interpreter_path, name): interpreter = Interpreter.PythonInterpreter(name, interpreter_path) if not interpreter.IsValidInterpreter: raise InterpreterAddError( _("%s is not a valid interpreter path") % interpreter_path) interpreter.Name = name if self.CheckInterpreterExist(interpreter): raise InterpreterAddError(_("interpreter have already exist")) self.interpreters.append(interpreter) #first interpreter should be the default interpreter by default if 1 == len(self.interpreters): self.MakeDefaultInterpreter() self.SetCurrentInterpreter(self.DefaultInterpreter) return interpreter
def LoadPythonInterpretersFromConfig(self): config = wx.ConfigBase_Get() if sysutils.isWindows(): data = config.Read(self.KEY_PREFIX) if not data: return False has_builtin_interpreter = False lst = pickle.loads(data.encode('ascii')) for l in lst: is_builtin = l.get('is_builtin', False) if is_builtin: interpreter = Interpreter.BuiltinPythonInterpreter( l['name'], l['path'], l['id']) has_builtin_interpreter = True else: interpreter = Interpreter.PythonInterpreter( l['name'], l['path'], l['id'], True) interpreter.Default = l['default'] if interpreter.Default: self.SetDefaultInterpreter(interpreter) data = { 'version': l['version'], 'builtins': l['builtins'], #'path_list' is the old key name of sys_path_list,we should make compatible of old version 'sys_path_list': l.get('sys_path_list', l.get('path_list')), 'python_path_list': l.get('python_path_list', []), 'is_builtin': is_builtin } interpreter.SetInterpreter(**data) interpreter.HelpPath = l.get('help_path', '') interpreter.Environ.SetEnviron(l.get('environ', {})) interpreter.Packages = l.get('packages', {}) self.interpreters.append(interpreter) app_debugLogger.info('load python interpreter from app config success,name is %s,path is %s,version is %s,is builtin %s',\ interpreter.Name,interpreter.Path,interpreter.Version,interpreter.IsBuiltIn) if len(self.interpreters) > 1 or (len(self.interpreters) == 1 and not has_builtin_interpreter): return True else: prefix = self.KEY_PREFIX data = config.Read(prefix) if not data: return False ids = data.split(os.pathsep) for id in ids: name = config.Read("%s/%s/Name" % (prefix, id)) path = config.Read("%s/%s/Path" % (prefix, id)) is_default = config.ReadInt("%s/%s/Default" % (prefix, id)) version = config.Read("%s/%s/Version" % (prefix, id)) sys_paths = config.Read("%s/%s/SysPathList" % (prefix, id)) python_path_list = config.Read( "%s/%s/PythonPathList" % (prefix, id), "") builtins = config.Read("%s/%s/Builtins" % (prefix, id)) environ = json.loads( config.Read("%s/%s/Environ" % (prefix, id), "{}")) packages = json.loads( config.Read("%s/%s/Packages" % (prefix, id), "{}")) interpreter = Interpreter.PythonInterpreter( name, path, id, True) interpreter.Default = is_default interpreter.Environ.SetEnviron(environ) interpreter.Packages = packages if interpreter.Default: self.SetDefaultInterpreter(interpreter) data = { 'version': version, 'builtins': builtins.split(os.pathsep), 'sys_path_list': sys_paths.split(os.pathsep), 'python_path_list': python_path_list.split(os.pathsep) } interpreter.SetInterpreter(**data) self.interpreters.append(interpreter) if len(self.interpreters) > 0: return True return False