Sun, 18 Oct 2020 12:35:30 +0200
Merged with default branch.
# -*- coding: utf-8 -*- # Copyright (c) 2020 Detlev Offenbach <detlev@die-offenbachs.de> # """ Module implementing a function to patch subprocess.Popen to support debugging of the process. """ import os import shlex from DebugUtilities import isPythonProgram, startsWithShebang, patchArguments _debugClient = None def patchSubprocess(module, debugClient): """ Function to patch the subprocess module. @param module reference to the imported module to be patched @type module @param debugClient reference to the debug client object @type DebugClient """ # __IGNORE_WARNING_D234__ global _debugClient # TODO: implement a process tracer # i.e. report which processes are started class PopenWrapper(module.Popen): """ Wrapper class for subprocess.Popen. """ def __init__(self, arguments, *args, **kwargs): """ Constructor @param arguments command line arguments for the new process @type list of str or str @param args constructor arguments of Popen @type list @param kwargs constructor keyword only arguments of Popen @type dict """ if ( _debugClient.debugging and _debugClient.multiprocessSupport and isinstance(arguments, (str, list)) ): if isinstance(arguments, str): # convert to arguments list arguments = shlex.split(arguments) else: # create a copy of the arguments arguments = arguments[:] ok = isPythonProgram(arguments[0]) if ok: if startsWithShebang(arguments[0]): scriptName = os.path.basename(arguments[0]) else: scriptName = os.path.basename(arguments[0]) if scriptName not in _debugClient.noDebugList: arguments = patchArguments( _debugClient, arguments, noRedirect=True ) super(PopenWrapper, self).__init__(arguments, *args, **kwargs) _debugClient = debugClient module.Popen = PopenWrapper