src/eric7/DebugClients/Python/SubprocessExtension.py

Mon, 24 Feb 2025 15:43:49 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Mon, 24 Feb 2025 15:43:49 +0100
branch
eric7
changeset 11148
15e30f0c76a8
parent 11090
f5f5f5803935
permissions
-rw-r--r--

Adjusted the code to the modified issue codes.

7424
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2
11090
f5f5f5803935 Updated copyright for 2025.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11088
diff changeset
3 # Copyright (c) 2020 - 2025 Detlev Offenbach <detlev@die-offenbachs.de>
7424
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 """
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7 Module implementing a function to patch subprocess.Popen to support debugging
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 of the process.
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9 """
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11 import os
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12 import shlex
11088
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
13 import shutil
7424
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14
8921
8459c7e1b904 Debug Client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8881
diff changeset
15 from DebugUtilities import (
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
16 isPythonProgram,
9473
3f23dbf37dbe Resorted the import statements using isort.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
17 isWindowsPlatform,
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
18 patchArguments,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
19 stringToArgumentsWindows,
8921
8459c7e1b904 Debug Client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8881
diff changeset
20 )
7424
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22 _debugClient = None
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25 def patchSubprocess(module, debugClient):
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26 """
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 Function to patch the subprocess module.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
28
7424
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29 @param module reference to the imported module to be patched
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 @type module
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 @param debugClient reference to the debug client object
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 @type DebugClient
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
33 """ # __IGNORE_WARNING_D234__
7424
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 global _debugClient
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
35
7424
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 class PopenWrapper(module.Popen):
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37 """
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 Wrapper class for subprocess.Popen.
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 """
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
40
10627
40b3df5b933a Fixed an issue with the MultiProcess extension for the subprocess module causing Popen to fail when the first argument was passed as a keyword (see issue 550).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10439
diff changeset
41 def __init__(self, args, *popenargs, **kwargs):
7424
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42 """
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43 Constructor
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
44
10627
40b3df5b933a Fixed an issue with the MultiProcess extension for the subprocess module causing Popen to fail when the first argument was passed as a keyword (see issue 550).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10439
diff changeset
45 @param args command line arguments for the new process
7424
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 @type list of str or str
10627
40b3df5b933a Fixed an issue with the MultiProcess extension for the subprocess module causing Popen to fail when the first argument was passed as a keyword (see issue 550).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10439
diff changeset
47 @param popenargs constructor arguments of Popen
7424
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 @type list
7563
b0d6b63f2843 Implemented multi process debugging support for the 'multiprocessing' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7424
diff changeset
49 @param kwargs constructor keyword only arguments of Popen
7424
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 @type dict
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 """
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 if (
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
53 _debugClient.debugging
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
54 and _debugClient.multiprocessSupport
10627
40b3df5b933a Fixed an issue with the MultiProcess extension for the subprocess module causing Popen to fail when the first argument was passed as a keyword (see issue 550).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10439
diff changeset
55 and isinstance(args, (str, list))
7424
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 ):
10627
40b3df5b933a Fixed an issue with the MultiProcess extension for the subprocess module causing Popen to fail when the first argument was passed as a keyword (see issue 550).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10439
diff changeset
57 if isinstance(args, str):
7424
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 # convert to arguments list
11088
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
59 args_list = (
10627
40b3df5b933a Fixed an issue with the MultiProcess extension for the subprocess module causing Popen to fail when the first argument was passed as a keyword (see issue 550).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10439
diff changeset
60 stringToArgumentsWindows(args)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
61 if isWindowsPlatform()
10627
40b3df5b933a Fixed an issue with the MultiProcess extension for the subprocess module causing Popen to fail when the first argument was passed as a keyword (see issue 550).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10439
diff changeset
62 else shlex.split(args)
8921
8459c7e1b904 Debug Client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8881
diff changeset
63 )
7424
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 else:
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65 # create a copy of the arguments
11088
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
66 args_list = args[:]
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
67 isPythonProg = isPythonProgram(
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
68 args_list[0],
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
69 withPath="shell" in kwargs and kwargs["shell"] is True,
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
70 )
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
71 if isPythonProg:
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
72 scriptName = os.path.basename(args_list[0])
7901
6ff7ccf0cb50 Debugger: refined the handling of not to be debugged scripts for multiprocess debugging.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7875
diff changeset
73 if not _debugClient.skipMultiProcessDebugging(scriptName):
11088
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
74 if (
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
75 "shell" in kwargs
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
76 and kwargs["shell"] is True
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
77 and not os.path.isabs(args_list[0])
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
78 ):
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
79 prog = shutil.which(args_list[0])
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
80 if prog:
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
81 args_list[0] = prog
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
82 args = patchArguments(
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
83 _debugClient,
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
84 args_list,
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
85 noRedirect=True,
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
86 isPythonProg=isPythonProg,
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
87 )
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
88 if "shell" in kwargs and kwargs["shell"] is True:
0299c9ba1c6f Improved subprocess debugging by support for the 'shell=True' parameter (see issue 575).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10633
diff changeset
89 args = shlex.join(args)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
90
10627
40b3df5b933a Fixed an issue with the MultiProcess extension for the subprocess module causing Popen to fail when the first argument was passed as a keyword (see issue 550).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10439
diff changeset
91 super().__init__(args, *popenargs, **kwargs)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
92
7424
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 _debugClient = debugClient
9bb7d8b0f966 Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 module.Popen = PopenWrapper

eric ide

mercurial