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": |