Sun, 18 Oct 2020 12:35:30 +0200
Merged with default branch.
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 | |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
3 | # Copyright (c) 2020 Detlev Offenbach <detlev@die-offenbachs.de> |
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 |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
13 | |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
14 | from DebugUtilities import isPythonProgram, startsWithShebang, patchArguments |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
15 | |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
16 | _debugClient = None |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
17 | |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
18 | |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
19 | def patchSubprocess(module, debugClient): |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
20 | """ |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
21 | Function to patch the subprocess module. |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
22 | |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
23 | @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
|
24 | @type module |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
25 | @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
|
26 | @type DebugClient |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
27 | """ # __IGNORE_WARNING_D234__ |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
28 | global _debugClient |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
29 | |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
30 | # TODO: implement a process tracer |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
31 | # i.e. report which processes are started |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
32 | class PopenWrapper(module.Popen): |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
33 | """ |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
34 | Wrapper class for subprocess.Popen. |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
35 | """ |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
36 | def __init__(self, arguments, *args, **kwargs): |
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 | Constructor |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
39 | |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
40 | @param arguments command line arguments for the new process |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
41 | @type list of str or str |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
42 | @param args constructor arguments of Popen |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
43 | @type list |
7563
b0d6b63f2843
Implemented multi process debugging support for the 'multiprocessing' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7424
diff
changeset
|
44 | @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
|
45 | @type dict |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
46 | """ |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
47 | if ( |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
48 | _debugClient.debugging and |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
49 | _debugClient.multiprocessSupport and |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
50 | isinstance(arguments, (str, list)) |
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 isinstance(arguments, str): |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
53 | # convert to arguments list |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
54 | arguments = shlex.split(arguments) |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
55 | else: |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
56 | # create a copy of the arguments |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
57 | arguments = arguments[:] |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
58 | ok = isPythonProgram(arguments[0]) |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
59 | if ok: |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
60 | if startsWithShebang(arguments[0]): |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
61 | scriptName = os.path.basename(arguments[0]) |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
62 | else: |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
63 | scriptName = os.path.basename(arguments[0]) |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
64 | if scriptName not in _debugClient.noDebugList: |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
65 | arguments = patchArguments( |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
66 | _debugClient, arguments, noRedirect=True |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
67 | ) |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
68 | |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
69 | super(PopenWrapper, self).__init__(arguments, *args, **kwargs) |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
70 | |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
71 | _debugClient = debugClient |
9bb7d8b0f966
Implemented multi process debugging support for the 'subprocess' module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
72 | module.Popen = PopenWrapper |