src/eric7/Debugger/DebuggerInterfacePython.py

branch
eric7-maintenance
changeset 11019
27cd57e98461
parent 10941
07cad049002c
parent 11009
5206e4c572e8
child 11063
bb05d1db9286
equal deleted inserted replaced
10947:c8df46dd566d 11019:27cd57e98461
9 9
10 import contextlib 10 import contextlib
11 import json 11 import json
12 import logging 12 import logging
13 import os 13 import os
14 import re
14 import shlex 15 import shlex
15 import struct 16 import struct
16 import time 17 import time
17 import zlib 18 import zlib
18 19
125 @type bool (optional) 126 @type bool (optional)
126 @return translated filename 127 @return translated filename
127 @rtype str 128 @rtype str
128 """ 129 """
129 if remote2local: 130 if remote2local:
130 path = fn.replace(self.translateRemote, self.translateLocal) 131 path = (
132 re.sub(
133 f"^{re.escape(self.translateRemote)}",
134 self.translateLocal,
135 fn,
136 flags=re.IGNORECASE,
137 )
138 if self.translateRemoteWindows
139 else fn.replace(self.translateRemote, self.translateLocal)
140 )
131 if self.translateLocalWindows: 141 if self.translateLocalWindows:
132 path = path.replace("/", "\\") 142 path = path.replace("/", "\\")
133 else: 143 else:
134 path = fn.replace(self.translateLocal, self.translateRemote) 144 path = (
145 re.sub(
146 f"^{re.escape(self.translateLocal)}",
147 self.translateRemote,
148 fn,
149 flags=re.IGNORECASE,
150 )
151 if self.translateLocalWindows
152 else fn.replace(self.translateLocal, self.translateRemote)
153 )
135 if not self.translateRemoteWindows: 154 if not self.translateRemoteWindows:
136 path = path.replace("\\", "/") 155 path = path.replace("\\", "/")
137 156
138 return path 157 return path
139 158
190 runInConsole, 209 runInConsole,
191 venvName, 210 venvName,
192 originalPathString, 211 originalPathString,
193 workingDir="", 212 workingDir="",
194 configOverride=None, 213 configOverride=None,
195 startRemote=None, 214 startViaServer=None,
196 ): 215 ):
197 """ 216 """
198 Public method to start a remote Python interpreter. 217 Public method to start a remote Python interpreter.
199 218
200 @param port port number the debug server is listening on 219 @param port port number the debug server is listening on
209 @param workingDir directory to start the debugger client in (defaults to "") 228 @param workingDir directory to start the debugger client in (defaults to "")
210 @type str (optional) 229 @type str (optional)
211 @param configOverride dictionary containing the global config override data 230 @param configOverride dictionary containing the global config override data
212 (defaults to None) 231 (defaults to None)
213 @type dict (optional) 232 @type dict (optional)
214 @param startRemote flag indicating to start the client via an eric-ide server 233 @param startViaServer flag indicating to start the client via an eric-ide server
215 (defaults to None) 234 (defaults to None)
216 @type bool (optional) 235 @type bool (optional)
217 @return client process object, a flag to indicate a network connection 236 @return client process object, a flag to indicate a network connection
218 and the name of the interpreter in case of a local execution 237 and the name of the interpreter in case of a local execution
219 @rtype tuple of (QProcess, bool, str) 238 @rtype tuple of (QProcess, bool, str)
220 """ 239 """
221 global origPathEnv 240 global origPathEnv
222 241
223 if ( 242 if (
224 startRemote is True 243 startViaServer is True
225 or ( 244 or (
226 startRemote is None 245 startViaServer is None
227 and ( 246 and (
228 venvName == self.debugServer.getEricServerEnvironmentString() 247 venvName == self.debugServer.getEricServerEnvironmentString()
229 or self.__ericServerDebugging 248 or self.__ericServerDebugging
230 ) 249 )
231 ) 250 )
232 ) and ericApp().getObject("EricServer").isServerConnected(): 251 ) and ericApp().getObject("EricServer").isServerConnected():
233 # TODO change this once server environment definitions are supported 252 startViaServer = True
234 startRemote = True
235 if venvName: 253 if venvName:
236 venvManager = ericApp().getObject("VirtualEnvManager") 254 venvManager = ericApp().getObject("VirtualEnvManager")
237 interpreter = venvManager.getVirtualenvInterpreter(venvName) 255 interpreter = venvManager.getVirtualenvInterpreter(venvName)
238 else: 256 else:
239 venvName = self.debugServer.getEricServerEnvironmentString() 257 venvName = self.debugServer.getEricServerEnvironmentString()
280 "--call-trace-optimization" 298 "--call-trace-optimization"
281 if Preferences.getDebugger("PythonCallTraceOptimization") 299 if Preferences.getDebugger("PythonCallTraceOptimization")
282 else "" 300 else ""
283 ) 301 )
284 302
285 if Preferences.getDebugger("RemoteDbgEnabled"): 303 if Preferences.getDebugger("RemoteDbgEnabled") and not startViaServer:
286 # remote debugging code 304 # remote debugging code
287 ipaddr = self.debugServer.getHostAddress(False) 305 ipaddr = self.debugServer.getHostAddress(False)
288 rexec = Preferences.getDebugger("RemoteExecution") 306 rexec = Preferences.getDebugger("RemoteExecution")
289 rhost = Preferences.getDebugger("RemoteHost") 307 rhost = Preferences.getDebugger("RemoteHost")
290 if rhost == "": 308 if rhost == "":
349 " login was given.</p>" 367 " login was given.</p>"
350 ), 368 ),
351 ) 369 )
352 return None, False, "" 370 return None, False, ""
353 371
354 elif startRemote and self.__ericServerDebuggerInterface is not None: 372 elif startViaServer and self.__ericServerDebuggerInterface is not None:
355 # debugging via an eric-ide server 373 # debugging via an eric-ide server
356 self.translate = self.__ericServerTranslation 374 self.translate = self.__ericServerTranslation
357 self.__ericServerDebugging = True 375 self.__ericServerDebugging = True
358 376
359 args = [] 377 args = []
479 runInConsole, 497 runInConsole,
480 venvName, 498 venvName,
481 originalPathString, 499 originalPathString,
482 workingDir=None, 500 workingDir=None,
483 configOverride=None, 501 configOverride=None,
484 startRemote=False, 502 startViaServer=None,
485 ): 503 ):
486 """ 504 """
487 Public method to start a remote Python interpreter for a project. 505 Public method to start a remote Python interpreter for a project.
488 506
489 @param port port number the debug server is listening on 507 @param port port number the debug server is listening on
498 @param workingDir directory to start the debugger client in 516 @param workingDir directory to start the debugger client in
499 @type str 517 @type str
500 @param configOverride dictionary containing the global config override 518 @param configOverride dictionary containing the global config override
501 data 519 data
502 @type dict 520 @type dict
503 @param startRemote flag indicating to start the client via an eric-ide server 521 @param startViaServer flag indicating to start the client via an eric-ide server
504 (defaults to False) 522 (defaults to None)
505 @type bool (optional) 523 @type bool (optional)
506 @return client process object, a flag to indicate a network connection 524 @return client process object, a flag to indicate a network connection
507 and the name of the interpreter in case of a local execution 525 and the name of the interpreter in case of a local execution
508 @rtype tuple of (QProcess, bool, str) 526 @rtype tuple of (QProcess, bool, str)
509 """ 527 """
528 if Preferences.getDebugger("PythonCallTraceOptimization") 546 if Preferences.getDebugger("PythonCallTraceOptimization")
529 else "" 547 else ""
530 ) 548 )
531 549
532 if ( 550 if (
533 startRemote is True 551 startViaServer is True
534 or ( 552 or (
535 startRemote is None 553 startViaServer is None
536 and ( 554 and (
537 venvName == self.debugServer.getEricServerEnvironmentString() 555 venvName == self.debugServer.getEricServerEnvironmentString()
538 or self.__ericServerDebugging 556 or self.__ericServerDebugging
539 ) 557 )
540 ) 558 )
541 ) and ericApp().getObject("EricServer").isServerConnected(): 559 ) and ericApp().getObject("EricServer").isServerConnected():
542 # TODO change this once server environment definitions are supported 560 startViaServer = True
543 startRemote = True
544 if venvName and venvName != self.debugServer.getProjectEnvironmentString(): 561 if venvName and venvName != self.debugServer.getProjectEnvironmentString():
545 venvManager = ericApp().getObject("VirtualEnvManager") 562 venvManager = ericApp().getObject("VirtualEnvManager")
546 interpreter = venvManager.getVirtualenvInterpreter(venvName) 563 interpreter = venvManager.getVirtualenvInterpreter(venvName)
547 else: 564 else:
548 venvName = project.getProjectVenv() 565 venvName = project.getProjectVenv()
569 586
570 self.__inShutdown = False 587 self.__inShutdown = False
571 588
572 self.__ericServerDebugging = False 589 self.__ericServerDebugging = False
573 590
574 if project.getDebugProperty("REMOTEDEBUGGER"): 591 if project.getDebugProperty("REMOTEDEBUGGER") and not startViaServer:
575 # remote debugging code 592 # remote debugging code
576 ipaddr = self.debugServer.getHostAddress(False) 593 ipaddr = self.debugServer.getHostAddress(False)
577 rexec = project.getDebugProperty("REMOTECOMMAND") 594 rexec = project.getDebugProperty("REMOTECOMMAND")
578 rhost = project.getDebugProperty("REMOTEHOST") 595 rhost = project.getDebugProperty("REMOTEHOST")
579 if rhost == "": 596 if rhost == "":
621 self.translateLocal = project.getDebugProperty("LOCALPATH") 638 self.translateLocal = project.getDebugProperty("LOCALPATH")
622 self.translateLocalWindows = "\\" in self.translateLocal 639 self.translateLocalWindows = "\\" in self.translateLocal
623 self.translate = self.__remoteTranslation 640 self.translate = self.__remoteTranslation
624 else: 641 else:
625 self.translate = self.__identityTranslation 642 self.translate = self.__identityTranslation
643
644 self.__startedVenv = "" if process is None else venvName
645
626 return process, self.__isNetworked, "" 646 return process, self.__isNetworked, ""
627 else: 647 else:
628 # remote shell command is missing 648 # remote shell command is missing
629 return None, self.__isNetworked, "" 649 return None, self.__isNetworked, ""
630 650
631 elif startRemote and self.__ericServerDebuggerInterface is not None: 651 elif startViaServer and self.__ericServerDebuggerInterface is not None:
632 # debugging via an eric-ide server 652 # debugging via an eric-ide server
633 self.translate = self.__ericServerTranslation 653 self.translate = self.__ericServerTranslation
634 self.__ericServerDebugging = True 654 self.__ericServerDebugging = True
635 655
636 args = [] 656 args = []
861 for jsonStr in self.__commandQueue: 881 for jsonStr in self.__commandQueue:
862 self.__ericServerDebuggerInterface.sendClientCommand( 882 self.__ericServerDebuggerInterface.sendClientCommand(
863 self.__mainDebugger, jsonStr 883 self.__mainDebugger, jsonStr
864 ) 884 )
865 else: 885 else:
866 conn = self.__connections[self.__mainDebugger] 886 with contextlib.suppress(KeyError):
867 for jsonStr in self.__commandQueue: 887 conn = self.__connections[self.__mainDebugger]
868 self.__writeJsonCommandToSocket(jsonStr, conn) 888 for jsonStr in self.__commandQueue:
889 self.__writeJsonCommandToSocket(jsonStr, conn)
869 890
870 self.__commandQueue.clear() 891 self.__commandQueue.clear()
871 892
872 def shutdown(self): 893 def shutdown(self):
873 """ 894 """

eric ide

mercurial