diff -r adb6b029b102 Lib/subprocess.py --- a/Lib/subprocess.py Wed Mar 09 15:02:31 2016 +0100 +++ b/Lib/subprocess.py Fri Mar 11 01:41:43 2016 +0200 @@ -669,7 +669,7 @@ self.stderr) -def run(*popenargs, input=None, timeout=None, check=False, **kwargs): +def run(*popenargs, input=None, timeout=None, check=False, kill_group=False, **kwargs): """Run command with arguments and return a CompletedProcess instance. The returned instance will have attributes args, returncode, stdout and @@ -704,12 +704,18 @@ try: stdout, stderr = process.communicate(input, timeout=timeout) except TimeoutExpired: - process.kill() + if kill_group: + process.killpg() + else: + process.kill() stdout, stderr = process.communicate() raise TimeoutExpired(process.args, timeout, output=stdout, stderr=stderr) except: - process.kill() + if kill_group: + process.killpg() + else: + process.kill() process.wait() raise retcode = process.poll() @@ -1779,3 +1785,8 @@ """Kill the process with SIGKILL """ self.send_signal(signal.SIGKILL) + + def killpg(self): + """Kill the process group with SIGKILL + """ + os.killpg(os.getpgid(self.pid), signal.SIGTERM)