eric6/Debugger/DebuggerInterfacePython.py

branch
maintenance
changeset 8142
43248bafe9b2
parent 8043
0acf98cd089a
parent 8138
169e65a6787c
child 8176
31965986ecd1
equal deleted inserted replaced
8044:874fdd14d3a2 8142:43248bafe9b2
8 """ 8 """
9 9
10 import sys 10 import sys
11 import os 11 import os
12 import logging 12 import logging
13 import shlex
13 14
14 from PyQt5.QtCore import ( 15 from PyQt5.QtCore import (
15 QObject, QProcess, QProcessEnvironment, QTimer 16 QObject, QProcess, QProcessEnvironment, QTimer
16 ) 17 )
17 18
57 58
58 self.queue = [] 59 self.queue = []
59 self.__master = None 60 self.__master = None
60 self.__connections = {} 61 self.__connections = {}
61 self.__pendingConnections = [] 62 self.__pendingConnections = []
63 self.__inShutdown = False
62 64
63 # set default values for capabilities of clients 65 # set default values for capabilities of clients
64 self.clientCapabilities = ClientDefaultCapabilities 66 self.clientCapabilities = ClientDefaultCapabilities
65 67
66 # set translation function 68 # set translation function
186 self.tr("Start Debugger"), 188 self.tr("Start Debugger"),
187 self.tr( 189 self.tr(
188 """<p>No suitable Python3 environment configured.</p>""") 190 """<p>No suitable Python3 environment configured.</p>""")
189 ) 191 )
190 return None, False, "" 192 return None, False, ""
193
194 self.__inShutdown = False
191 195
192 debugClientType = Preferences.getDebugger("DebugClientType3") 196 debugClientType = Preferences.getDebugger("DebugClientType3")
193 if debugClientType == "standard": 197 if debugClientType == "standard":
194 debugClient = os.path.join(getConfig('ericDir'), 198 debugClient = os.path.join(getConfig('ericDir'),
195 "DebugClients", "Python", 199 "DebugClients", "Python",
263 clientEnv = {} 267 clientEnv = {}
264 else: 268 else:
265 clientEnv = os.environ.copy() 269 clientEnv = os.environ.copy()
266 if originalPathString: 270 if originalPathString:
267 clientEnv["PATH"] = originalPathString 271 clientEnv["PATH"] = originalPathString
268 envlist = Utilities.parseEnvironmentString( 272 envlist = shlex.split(
269 Preferences.getDebugger("DebugEnvironment")) 273 Preferences.getDebugger("DebugEnvironment"))
270 for el in envlist: 274 for el in envlist:
271 try: 275 try:
272 key, value = el.split('=', 1) 276 key, value = el.split('=', 1)
273 if value.startswith('"') or value.startswith("'"):
274 value = value[1:-1]
275 clientEnv[str(key)] = str(value) 277 clientEnv[str(key)] = str(value)
276 except ValueError: 278 except ValueError:
277 pass 279 pass
278 if execPath: 280 if execPath:
279 if "PATH" in clientEnv: 281 if "PATH" in clientEnv:
382 self.tr("Start Debugger"), 384 self.tr("Start Debugger"),
383 self.tr( 385 self.tr(
384 """<p>No suitable Python3 environment configured.</p>""") 386 """<p>No suitable Python3 environment configured.</p>""")
385 ) 387 )
386 return None, self.__isNetworked, "" 388 return None, self.__isNetworked, ""
389
390 self.__inShutdown = False
387 391
388 if project.getDebugProperty("REMOTEDEBUGGER"): 392 if project.getDebugProperty("REMOTEDEBUGGER"):
389 ipaddr = self.debugServer.getHostAddress(False) 393 ipaddr = self.debugServer.getHostAddress(False)
390 rexec = project.getDebugProperty("REMOTECOMMAND") 394 rexec = project.getDebugProperty("REMOTECOMMAND")
391 rhost = project.getDebugProperty("REMOTEHOST") 395 rhost = project.getDebugProperty("REMOTEHOST")
440 clientEnv = {} 444 clientEnv = {}
441 else: 445 else:
442 clientEnv = os.environ.copy() 446 clientEnv = os.environ.copy()
443 if originalPathString: 447 if originalPathString:
444 clientEnv["PATH"] = originalPathString 448 clientEnv["PATH"] = originalPathString
445 envlist = Utilities.parseEnvironmentString( 449 envlist = shlex.split(
446 project.getDebugProperty("ENVIRONMENTSTRING")) 450 project.getDebugProperty("ENVIRONMENTSTRING"))
447 for el in envlist: 451 for el in envlist:
448 try: 452 try:
449 key, value = el.split('=', 1) 453 key, value = el.split('=', 1)
450 if value.startswith('"') or value.startswith("'"):
451 value = value[1:-1]
452 clientEnv[str(key)] = str(value) 454 clientEnv[str(key)] = str(value)
453 except ValueError: 455 except ValueError:
454 pass 456 pass
455 if execPath: 457 if execPath:
456 if "PATH" in clientEnv: 458 if "PATH" in clientEnv:
576 del self.__connections[debuggerId] 578 del self.__connections[debuggerId]
577 if debuggerId == self.__master: 579 if debuggerId == self.__master:
578 self.__master = None 580 self.__master = None
579 if debuggerId in self.__autoContinued: 581 if debuggerId in self.__autoContinued:
580 self.__autoContinued.remove(debuggerId) 582 self.__autoContinued.remove(debuggerId)
581 self.debugServer.signalClientDisconnected(debuggerId) 583 if not self.__inShutdown:
584 self.debugServer.signalClientDisconnected(debuggerId)
582 break 585 break
583 else: 586 else:
584 if sock in self.__pendingConnections: 587 if sock in self.__pendingConnections:
585 self.__pendingConnections.remove(sock) 588 self.__pendingConnections.remove(sock)
586 589
624 (Needed on Win OS) 627 (Needed on Win OS)
625 """ 628 """
626 if not self.__master: 629 if not self.__master:
627 return 630 return
628 631
632 self.__inShutdown = True
633
629 while self.__connections: 634 while self.__connections:
630 debuggerId, sock = self.__connections.popitem() 635 debuggerId, sock = self.__connections.popitem()
631 self.__shutdownSocket(sock) 636 self.__shutdownSocket(sock)
632 637
633 while self.__pendingConnections: 638 while self.__pendingConnections:
673 Public method to set the environment for a program to debug, run, ... 678 Public method to set the environment for a program to debug, run, ...
674 679
675 @param env environment settings 680 @param env environment settings
676 @type dict 681 @type dict
677 """ 682 """
678 if self.__master: 683 self.__sendJsonCommand("RequestEnvironment", {"environment": env},
679 self.__sendJsonCommand("RequestEnvironment", {"environment": env}, 684 self.__master)
680 self.__master)
681 685
682 def remoteLoad(self, fn, argv, wd, traceInterpreter=False, 686 def remoteLoad(self, fn, argv, wd, traceInterpreter=False,
683 autoContinue=True, enableMultiprocess=False): 687 autoContinue=True, enableMultiprocess=False):
684 """ 688 """
685 Public method to load a new program to debug. 689 Public method to load a new program to debug.
1504 elif method == "ResponseExit": 1508 elif method == "ResponseExit":
1505 self.__scriptName = "" 1509 self.__scriptName = ""
1506 self.debugServer.signalClientExit( 1510 self.debugServer.signalClientExit(
1507 params["program"], params["status"], params["message"], 1511 params["program"], params["status"], params["message"],
1508 params["debuggerId"]) 1512 params["debuggerId"])
1513 if params["debuggerId"] == self.__master:
1514 self.debugServer.signalMainClientExit()
1509 1515
1510 elif method == "PassiveStartup": 1516 elif method == "PassiveStartup":
1511 self.debugServer.passiveStartUp( 1517 self.debugServer.passiveStartUp(
1512 self.translate(params["filename"], True), params["exceptions"], 1518 self.translate(params["filename"], True), params["exceptions"],
1513 params["debuggerId"]) 1519 params["debuggerId"])

eric ide

mercurial