RefactoringRope/CodeAssistServer.py

changeset 285
247d62c682dc
parent 283
d98e971d9e4c
child 287
09afe26b734c
diff -r 18f32c079abc -r 247d62c682dc RefactoringRope/CodeAssistServer.py
--- a/RefactoringRope/CodeAssistServer.py	Sun Oct 28 12:30:59 2018 +0100
+++ b/RefactoringRope/CodeAssistServer.py	Sat Nov 03 18:21:20 2018 +0100
@@ -505,7 +505,7 @@
                     params["ExceptionValue"],
                     params["Traceback"]))
     
-    def __startCodeAssistClient(self, interpreter, idString):
+    def __startCodeAssistClient(self, interpreter, idString, clientEnv):
         """
         Private method to start the code assist client with the given
         interpreter.
@@ -514,6 +514,9 @@
         @type str
         @param idString id of the client to be started
         @type str
+        @param clientEnv dictionary with environment variables to run the
+            interpreter with
+        @type dict
         @return flag indicating a successful start of the client
         @rtype bool
         """
@@ -531,7 +534,7 @@
             client = os.path.join(os.path.dirname(__file__),
                                   "CodeAssistClient.py")
             ok = self.startClient(interpreter, client, [configDir],
-                                  idString=idString)
+                                  idString=idString, environment=clientEnv)
             if not ok:
                 self.__ui.appendToStderr(self.tr(
                     "'{0}' is not supported because the configured interpreter"
@@ -560,10 +563,11 @@
         if not ok:
             # client is not running
             if idString == CodeAssistServer.IdProject:
-                interpreter = self.__interpreterForProject()
+                interpreter, clientEnv = self.__interpreterForProject()
             else:
                 interpreter = ""
                 venvName = ""
+                clientEnv = os.environ.copy()
                 try:
                     # new code using virtual environments
                     venvManager = e5App().getObject("VirtualEnvManager")
@@ -590,6 +594,21 @@
                     if venvName:
                         interpreter = \
                             venvManager.getVirtualenvInterpreter(venvName)
+                        
+                        try:
+                            execPath = \
+                                venvManager.getVirtualenvExecPath(venvName)
+                        except AttributeError:
+                            # eric6 < 18.12
+                            execPath = ""
+                        
+                        # build a suitable environment
+                        if execPath:
+                            if "PATH" in clientEnv:
+                                clientEnv["PATH"] = os.pathsep.join(
+                                    [execPath, clientEnv["PATH"]])
+                            else:
+                                clientEnv["PATH"] = execPath
                 except KeyError:
                     # backward compatibility (eric <18.07)
                     if idString == "Python2":
@@ -601,19 +620,23 @@
                         interpreter = \
                             Preferences.getDebugger("Python3Interpreter")
             if interpreter:
-                ok = self.__startCodeAssistClient(interpreter, idString)
+                ok = self.__startCodeAssistClient(interpreter, idString,
+                                                  clientEnv)
             else:
                 ok = False
         return ok
     
     def __interpreterForProject(self):
         """
-        Private method to determine the interpreter for the current project.
+        Private method to determine the interpreter for the current project and
+        the environment to run it.
         
-        @return interpreter of the current project
-        @rtype str
+        @return tuple containing the interpreter of the current project and the
+            environment variables
+        @rtype tuple of (str, dict)
         """
         interpreter = ""
+        clientEnv = os.environ.copy()
         projectLanguage = self.__e5project.getProjectLanguage()
         
         if projectLanguage.startswith("Python"):
@@ -650,6 +673,20 @@
                 if venvName:
                     interpreter = \
                         venvManager.getVirtualenvInterpreter(venvName)
+                    
+                    try:
+                        execPath = venvManager.getVirtualenvExecPath(venvName)
+                    except AttributeError:
+                        # eric6 < 18.12
+                        execPath = ""
+                    
+                    # build a suitable environment
+                    if execPath:
+                        if "PATH" in clientEnv:
+                            clientEnv["PATH"] = os.pathsep.join(
+                                [execPath, clientEnv["PATH"]])
+                        else:
+                            clientEnv["PATH"] = execPath
             except KeyError:
                 # backward compatibility (eric < 18.07)
                 # get interpreter from project first
@@ -663,7 +700,7 @@
                         interpreter = Preferences.getDebugger(
                             "Python3Interpreter")
         
-        return interpreter
+        return interpreter, clientEnv
     
     @pyqtSlot()
     def handleNewConnection(self):

eric ide

mercurial