Debugger/DebuggerInterfacePython.py

changeset 6576
ea60ea85067a
parent 6503
e617c58807e8
child 6581
8eb6220f2bb7
equal deleted inserted replaced
6575:40a11619ee77 6576:ea60ea85067a
53 53
54 self.debugServer = debugServer 54 self.debugServer = debugServer
55 self.passive = passive 55 self.passive = passive
56 self.process = None 56 self.process = None
57 self.__variant = pythonVariant 57 self.__variant = pythonVariant
58 self.__startedVenv = ""
58 59
59 self.qsock = None 60 self.qsock = None
60 self.queue = [] 61 self.queue = []
61 62
62 # set default values for capabilities of clients 63 # set default values for capabilities of clients
121 if environment is not None: 122 if environment is not None:
122 env = QProcessEnvironment() 123 env = QProcessEnvironment()
123 for key, value in list(environment.items()): 124 for key, value in list(environment.items()):
124 env.insert(key, value) 125 env.insert(key, value)
125 proc.setProcessEnvironment(env) 126 proc.setProcessEnvironment(env)
126 args = [] 127 args = arguments[:]
127 for arg in arguments:
128 args.append(arg)
129 proc.start(program, args) 128 proc.start(program, args)
130 if not proc.waitForStarted(10000): 129 if not proc.waitForStarted(10000):
131 proc = None 130 proc = None
132 131
133 return proc 132 return proc
150 if not venvName: 149 if not venvName:
151 if self.__variant == "Python2": 150 if self.__variant == "Python2":
152 venvName = Preferences.getDebugger("Python2VirtualEnv") 151 venvName = Preferences.getDebugger("Python2VirtualEnv")
153 else: 152 else:
154 venvName = Preferences.getDebugger("Python3VirtualEnv") 153 venvName = Preferences.getDebugger("Python3VirtualEnv")
155 interpreter = e5App().getObject("VirtualEnvManager")\ 154 venvManager = e5App().getObject("VirtualEnvManager")
156 .getVirtualenvInterpreter(venvName) 155 interpreter = venvManager.getVirtualenvInterpreter(venvName)
156 execPath = venvManager.getVirtualenvExecPath(venvName)
157 if interpreter == "" and \ 157 if interpreter == "" and \
158 int(self.__variant[-1]) == sys.version_info[0]: 158 int(self.__variant[-1]) == sys.version_info[0]:
159 # use the interpreter used to run eric for identical variants 159 # use the interpreter used to run eric for identical variants
160 interpreter = sys.executable.replace("w.exe", ".exe") 160 interpreter = sys.executable.replace("w.exe", ".exe")
161 if interpreter == "": 161 if interpreter == "":
241 if value.startswith('"') or value.startswith("'"): 241 if value.startswith('"') or value.startswith("'"):
242 value = value[1:-1] 242 value = value[1:-1]
243 clientEnv[str(key)] = str(value) 243 clientEnv[str(key)] = str(value)
244 except ValueError: 244 except ValueError:
245 pass 245 pass
246 if execPath:
247 if "PATH" in clientEnv:
248 clientEnv["PATH"] = os.pathsep.join(
249 [execPath, clientEnv["PATH"]])
250 else:
251 clientEnv["PATH"] = execPath
246 252
247 ipaddr = self.debugServer.getHostAddress(True) 253 ipaddr = self.debugServer.getHostAddress(True)
248 if runInConsole or Preferences.getDebugger("ConsoleDbgEnabled"): 254 if runInConsole or Preferences.getDebugger("ConsoleDbgEnabled"):
249 ccmd = Preferences.getDebugger("ConsoleDbgCommand") 255 ccmd = Preferences.getDebugger("ConsoleDbgCommand")
250 if ccmd: 256 if ccmd:
265 process = self.__startProcess( 271 process = self.__startProcess(
266 interpreter, 272 interpreter,
267 [debugClient, noencoding, str(port), redirect, ipaddr], 273 [debugClient, noencoding, str(port), redirect, ipaddr],
268 clientEnv) 274 clientEnv)
269 if process is None: 275 if process is None:
276 self.__startedVenv = ""
270 E5MessageBox.critical( 277 E5MessageBox.critical(
271 None, 278 None,
272 self.tr("Start Debugger"), 279 self.tr("Start Debugger"),
273 self.tr( 280 self.tr(
274 """<p>The debugger backend could not be started.</p>""")) 281 """<p>The debugger backend could not be started.</p>"""))
282 else:
283 self.__startedVenv = venvName
284
275 return process, self.__isNetworked, interpreter 285 return process, self.__isNetworked, interpreter
276 286
277 def startRemoteForProject(self, port, runInConsole, venvName): 287 def startRemoteForProject(self, port, runInConsole, venvName):
278 """ 288 """
279 Public method to start a remote Python interpreter for a project. 289 Public method to start a remote Python interpreter for a project.
292 project = e5App().getObject("Project") 302 project = e5App().getObject("Project")
293 if not project.isDebugPropertiesLoaded(): 303 if not project.isDebugPropertiesLoaded():
294 return None, self.__isNetworked, "" 304 return None, self.__isNetworked, ""
295 305
296 # start debugger with project specific settings 306 # start debugger with project specific settings
307 debugClient = project.getDebugProperty("DEBUGCLIENT")
297 if not venvName: 308 if not venvName:
298 venvName = project.getDebugProperty("VIRTUALENV") 309 venvName = project.getDebugProperty("VIRTUALENV")
299 debugClient = project.getDebugProperty("DEBUGCLIENT") 310 if not venvName:
311 if project.getProjectLanguage() == "Python2":
312 venvName = Preferences.getDebugger("Python2VirtualEnv")
313 elif project.getProjectLanguage() == "Python3":
314 venvName = Preferences.getDebugger("Python3VirtualEnv")
300 315
301 redirect = str(project.getDebugProperty("REDIRECT")) 316 redirect = str(project.getDebugProperty("REDIRECT"))
302 noencoding = \ 317 noencoding = \
303 project.getDebugProperty("NOENCODING") and '--no-encoding' or '' 318 project.getDebugProperty("NOENCODING") and '--no-encoding' or ''
304 319
305 interpreter = e5App().getObject("VirtualEnvManager")\ 320 venvManager = e5App().getObject("VirtualEnvManager")
306 .getVirtualenvInterpreter(venvName) 321 interpreter = venvManager.getVirtualenvInterpreter(venvName)
322 execPath = venvManager.getVirtualenvExecPath(venvName)
307 if interpreter == "" and \ 323 if interpreter == "" and \
308 project.getProjectLanguage().startswith("Python") and \ 324 project.getProjectLanguage().startswith("Python") and \
309 sys.version_info[0] == int(project.getProjectLanguage()[-1]): 325 sys.version_info[0] == int(project.getProjectLanguage()[-1]):
310 interpreter = sys.executable.replace("w.exe", ".exe") 326 interpreter = sys.executable.replace("w.exe", ".exe")
311 if interpreter == "": 327 if interpreter == "":
363 if value.startswith('"') or value.startswith("'"): 379 if value.startswith('"') or value.startswith("'"):
364 value = value[1:-1] 380 value = value[1:-1]
365 clientEnv[str(key)] = str(value) 381 clientEnv[str(key)] = str(value)
366 except ValueError: 382 except ValueError:
367 pass 383 pass
384 if execPath:
385 if "PATH" in clientEnv:
386 clientEnv["PATH"] = os.pathsep.join(
387 [execPath, clientEnv["PATH"]])
388 else:
389 clientEnv["PATH"] = execPath
368 390
369 ipaddr = self.debugServer.getHostAddress(True) 391 ipaddr = self.debugServer.getHostAddress(True)
370 if runInConsole or project.getDebugProperty("CONSOLEDEBUGGER"): 392 if runInConsole or project.getDebugProperty("CONSOLEDEBUGGER"):
371 ccmd = project.getDebugProperty("CONSOLECOMMAND") or \ 393 ccmd = project.getDebugProperty("CONSOLECOMMAND") or \
372 Preferences.getDebugger("ConsoleDbgCommand") 394 Preferences.getDebugger("ConsoleDbgCommand")
388 process = self.__startProcess( 410 process = self.__startProcess(
389 interpreter, 411 interpreter,
390 [debugClient, noencoding, str(port), redirect, ipaddr], 412 [debugClient, noencoding, str(port), redirect, ipaddr],
391 clientEnv) 413 clientEnv)
392 if process is None: 414 if process is None:
415 self.__startedVenv = ""
393 E5MessageBox.critical( 416 E5MessageBox.critical(
394 None, 417 None,
395 self.tr("Start Debugger"), 418 self.tr("Start Debugger"),
396 self.tr( 419 self.tr(
397 """<p>The debugger backend could not be started.</p>""")) 420 """<p>The debugger backend could not be started.</p>"""))
421 else:
422 self.__startedVenv = venvName
423
398 return process, self.__isNetworked, interpreter 424 return process, self.__isNetworked, interpreter
399 425
400 def getClientCapabilities(self): 426 def getClientCapabilities(self):
401 """ 427 """
402 Public method to retrieve the debug clients capabilities. 428 Public method to retrieve the debug clients capabilities.
994 self.debugServer.signalClientThreadSet() 1020 self.debugServer.signalClientThreadSet()
995 1021
996 elif method == "ResponseCapabilities": 1022 elif method == "ResponseCapabilities":
997 self.clientCapabilities = params["capabilities"] 1023 self.clientCapabilities = params["capabilities"]
998 self.debugServer.signalClientCapabilities( 1024 self.debugServer.signalClientCapabilities(
999 params["capabilities"], params["clientType"]) 1025 params["capabilities"],
1026 params["clientType"],
1027 self.__startedVenv,
1028 )
1000 1029
1001 elif method == "ResponseBanner": 1030 elif method == "ResponseBanner":
1002 self.debugServer.signalClientBanner( 1031 self.debugServer.signalClientBanner(
1003 params["version"], 1032 params["version"],
1004 params["platform"], 1033 params["platform"],
1005 params["dbgclient"]) 1034 params["dbgclient"],
1035 self.__startedVenv,
1036 )
1006 1037
1007 elif method == "ResponseOK": 1038 elif method == "ResponseOK":
1008 self.debugServer.signalClientStatement(False) 1039 self.debugServer.signalClientStatement(False)
1009 1040
1010 elif method == "ResponseContinue": 1041 elif method == "ResponseContinue":

eric ide

mercurial