Debugger/DebuggerInterfacePython.py

changeset 6576
ea60ea85067a
parent 6503
e617c58807e8
child 6581
8eb6220f2bb7
--- a/Debugger/DebuggerInterfacePython.py	Sat Nov 03 14:16:43 2018 +0100
+++ b/Debugger/DebuggerInterfacePython.py	Sat Nov 03 14:19:21 2018 +0100
@@ -55,6 +55,7 @@
         self.passive = passive
         self.process = None
         self.__variant = pythonVariant
+        self.__startedVenv = ""
         
         self.qsock = None
         self.queue = []
@@ -123,9 +124,7 @@
             for key, value in list(environment.items()):
                 env.insert(key, value)
             proc.setProcessEnvironment(env)
-        args = []
-        for arg in arguments:
-            args.append(arg)
+        args = arguments[:]
         proc.start(program, args)
         if not proc.waitForStarted(10000):
             proc = None
@@ -152,8 +151,9 @@
                 venvName = Preferences.getDebugger("Python2VirtualEnv")
             else:
                 venvName = Preferences.getDebugger("Python3VirtualEnv")
-        interpreter = e5App().getObject("VirtualEnvManager")\
-            .getVirtualenvInterpreter(venvName)
+        venvManager = e5App().getObject("VirtualEnvManager")
+        interpreter = venvManager.getVirtualenvInterpreter(venvName)
+        execPath = venvManager.getVirtualenvExecPath(venvName)
         if interpreter == "" and \
            int(self.__variant[-1]) == sys.version_info[0]:
             # use the interpreter used to run eric for identical variants
@@ -243,6 +243,12 @@
                 clientEnv[str(key)] = str(value)
             except ValueError:
                 pass
+        if execPath:
+            if "PATH" in clientEnv:
+                clientEnv["PATH"] = os.pathsep.join(
+                    [execPath, clientEnv["PATH"]])
+            else:
+                clientEnv["PATH"] = execPath
         
         ipaddr = self.debugServer.getHostAddress(True)
         if runInConsole or Preferences.getDebugger("ConsoleDbgEnabled"):
@@ -267,11 +273,15 @@
             [debugClient, noencoding, str(port), redirect, ipaddr],
             clientEnv)
         if process is None:
+            self.__startedVenv = ""
             E5MessageBox.critical(
                 None,
                 self.tr("Start Debugger"),
                 self.tr(
                     """<p>The debugger backend could not be started.</p>"""))
+        else:
+            self.__startedVenv = venvName
+        
         return process, self.__isNetworked, interpreter
 
     def startRemoteForProject(self, port, runInConsole, venvName):
@@ -294,16 +304,22 @@
             return None, self.__isNetworked, ""
         
         # start debugger with project specific settings
+        debugClient = project.getDebugProperty("DEBUGCLIENT")
         if not venvName:
             venvName = project.getDebugProperty("VIRTUALENV")
-        debugClient = project.getDebugProperty("DEBUGCLIENT")
+        if not venvName:
+            if project.getProjectLanguage() == "Python2":
+                venvName = Preferences.getDebugger("Python2VirtualEnv")
+            elif project.getProjectLanguage() == "Python3":
+                venvName = Preferences.getDebugger("Python3VirtualEnv")
         
         redirect = str(project.getDebugProperty("REDIRECT"))
         noencoding = \
             project.getDebugProperty("NOENCODING") and '--no-encoding' or ''
         
-        interpreter = e5App().getObject("VirtualEnvManager")\
-            .getVirtualenvInterpreter(venvName)
+        venvManager = e5App().getObject("VirtualEnvManager")
+        interpreter = venvManager.getVirtualenvInterpreter(venvName)
+        execPath = venvManager.getVirtualenvExecPath(venvName)
         if interpreter == "" and \
            project.getProjectLanguage().startswith("Python") and \
            sys.version_info[0] == int(project.getProjectLanguage()[-1]):
@@ -365,6 +381,12 @@
                 clientEnv[str(key)] = str(value)
             except ValueError:
                 pass
+        if execPath:
+            if "PATH" in clientEnv:
+                clientEnv["PATH"] = os.pathsep.join(
+                    [execPath, clientEnv["PATH"]])
+            else:
+                clientEnv["PATH"] = execPath
         
         ipaddr = self.debugServer.getHostAddress(True)
         if runInConsole or project.getDebugProperty("CONSOLEDEBUGGER"):
@@ -390,11 +412,15 @@
             [debugClient, noencoding, str(port), redirect, ipaddr],
             clientEnv)
         if process is None:
+            self.__startedVenv = ""
             E5MessageBox.critical(
                 None,
                 self.tr("Start Debugger"),
                 self.tr(
                     """<p>The debugger backend could not be started.</p>"""))
+        else:
+            self.__startedVenv = venvName
+        
         return process, self.__isNetworked, interpreter
 
     def getClientCapabilities(self):
@@ -996,13 +1022,18 @@
         elif method == "ResponseCapabilities":
             self.clientCapabilities = params["capabilities"]
             self.debugServer.signalClientCapabilities(
-                params["capabilities"], params["clientType"])
+                params["capabilities"],
+                params["clientType"],
+                self.__startedVenv,
+            )
         
         elif method == "ResponseBanner":
             self.debugServer.signalClientBanner(
                 params["version"],
                 params["platform"],
-                params["dbgclient"])
+                params["dbgclient"],
+                self.__startedVenv,
+            )
         
         elif method == "ResponseOK":
             self.debugServer.signalClientStatement(False)

eric ide

mercurial