--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric6/DebugClients/Python/SubprocessExtension.py Mon Feb 17 19:23:27 2020 +0100 @@ -0,0 +1,72 @@ +# -*- 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 keword 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