1# subprocess - Subprocesses with accessible I/O streams 2# 3# For more information about this module, see PEP 324. 4# 5# Copyright (c) 2003-2005 by Peter Astrand <astrand@lysator.liu.se> 6# 7# Licensed to PSF under a Contributor Agreement. 8 9r"""Subprocesses with accessible I/O streams 10 11This module allows you to spawn processes, connect to their 12input/output/error pipes, and obtain their return codes. 13 14For a complete description of this module see the Python documentation. 15 16Main API 17======== 18run(...): Runs a command, waits for it to complete, then returns a 19 CompletedProcess instance. 20Popen(...): A class for flexibly executing a command in a new process 21 22Constants 23--------- 24DEVNULL: Special value that indicates that os.devnull should be used 25PIPE: Special value that indicates a pipe should be created 26STDOUT: Special value that indicates that stderr should go to stdout 27 28 29Older API 30========= 31call(...): Runs a command, waits for it to complete, then returns 32 the return code. 33check_call(...): Same as call() but raises CalledProcessError() 34 if return code is not 0 35check_output(...): Same as check_call() but returns the contents of 36 stdout instead of a return code 37getoutput(...): Runs a command in the shell, waits for it to complete, 38 then returns the output 39getstatusoutput(...): Runs a command in the shell, waits for it to complete, 40 then returns a (exitcode, output) tuple 41""" 42 43import builtins 44import errno 45import io 46import os 47import time 48import signal 49import sys 50import threading 51import warnings 52import contextlib 53from time import monotonic as _time 54import types 55 56try: 57 import fcntl 58except ImportError: 59 fcntl = None 60 61 62__all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "getstatusoutput", 63 "getoutput", "check_output", "run", "CalledProcessError", "DEVNULL", 64 "SubprocessError", "TimeoutExpired", "CompletedProcess"] 65 # NOTE: We intentionally exclude list2cmdline as it is 66 # considered an internal implementation detail. issue10838. 67 68try: 69 import msvcrt 70 import _winapi 71 _mswindows = True 72except ModuleNotFoundError: 73 _mswindows = False 74 import _posixsubprocess 75 import select 76 import selectors 77else: 78 from _winapi import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP, 79 STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, 80 STD_ERROR_HANDLE, SW_HIDE, 81 STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW, 82 ABOVE_NORMAL_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, 83 HIGH_PRIORITY_CLASS, IDLE_PRIORITY_CLASS, 84 NORMAL_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS, 85 CREATE_NO_WINDOW, DETACHED_PROCESS, 86 CREATE_DEFAULT_ERROR_MODE, CREATE_BREAKAWAY_FROM_JOB) 87 88 __all__.extend(["CREATE_NEW_CONSOLE", "CREATE_NEW_PROCESS_GROUP", 89 "STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE", 90 "STD_ERROR_HANDLE", "SW_HIDE", 91 "STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW", 92 "STARTUPINFO", 93 "ABOVE_NORMAL_PRIORITY_CLASS", "BELOW_NORMAL_PRIORITY_CLASS", 94 "HIGH_PRIORITY_CLASS", "IDLE_PRIORITY_CLASS", 95 "NORMAL_PRIORITY_CLASS", "REALTIME_PRIORITY_CLASS", 96 "CREATE_NO_WINDOW", "DETACHED_PROCESS", 97 "CREATE_DEFAULT_ERROR_MODE", "CREATE_BREAKAWAY_FROM_JOB"]) 98 99 100# Exception classes used by this module. 101class SubprocessError(Exception): pass 102 103 104class CalledProcessError(SubprocessError): 105 """Raised when run() is called with check=True and the process 106 returns a non-zero exit status. 107 108 Attributes: 109 cmd, returncode, stdout, stderr, output 110 """ 111 def __init__(self, returncode, cmd, output=None, stderr=None): 112 self.returncode = returncode 113 self.cmd = cmd 114 self.output = output 115 self.stderr = stderr 116 117 def __str__(self): 118 if self.returncode and self.returncode < 0: 119 try: 120 return "Command '%s' died with %r." % ( 121 self.cmd, signal.Signals(-self.returncode)) 122 except ValueError: 123 return "Command '%s' died with unknown signal %d." % ( 124 self.cmd, -self.returncode) 125 else: 126 return "Command '%s' returned non-zero exit status %d." % ( 127 self.cmd, self.returncode) 128 129 @property 130 def stdout(self): 131 """Alias for output attribute, to match stderr""" 132 return self.output 133 134 @stdout.setter 135 def stdout(self, value): 136 # There's no obvious reason to set this, but allow it anyway so 137 # .stdout is a transparent alias for .output 138 self.output = value 139 140 141class TimeoutExpired(SubprocessError): 142 """This exception is raised when the timeout expires while waiting for a 143 child process. 144 145 Attributes: 146 cmd, output, stdout, stderr, timeout 147 """ 148 def __init__(self, cmd, timeout, output=None, stderr=None): 149 self.cmd = cmd 150 self.timeout = timeout 151 self.output = output 152 self.stderr = stderr 153 154 def __str__(self): 155 return ("Command '%s' timed out after %s seconds" % 156 (self.cmd, self.timeout)) 157 158 @property 159 def stdout(self): 160 return self.output 161 162 @stdout.setter 163 def stdout(self, value): 164 # There's no obvious reason to set this, but allow it anyway so 165 # .stdout is a transparent alias for .output 166 self.output = value 167 168 169if _mswindows: 170 class STARTUPINFO: 171 def __init__(self, *, dwFlags=0, hStdInput=None, hStdOutput=None, 172 hStdError=None, wShowWindow=0, lpAttributeList=None): 173 self.dwFlags = dwFlags 174 self.hStdInput = hStdInput 175 self.hStdOutput = hStdOutput 176 self.hStdError = hStdError 177 self.wShowWindow = wShowWindow 178 self.lpAttributeList = lpAttributeList or {"handle_list": []} 179 180 def copy(self): 181 attr_list = self.lpAttributeList.copy() 182 if 'handle_list' in attr_list: 183 attr_list['handle_list'] = list(attr_list['handle_list']) 184 185 return STARTUPINFO(dwFlags=self.dwFlags, 186 hStdInput=self.hStdInput, 187 hStdOutput=self.hStdOutput, 188 hStdError=self.hStdError, 189 wShowWindow=self.wShowWindow, 190 lpAttributeList=attr_list) 191 192 193 class Handle(int): 194 closed = False 195 196 def Close(self, CloseHandle=_winapi.CloseHandle): 197 if not self.closed: 198 self.closed = True 199 CloseHandle(self) 200 201 def Detach(self): 202 if not self.closed: 203 self.closed = True 204 return int(self) 205 raise ValueError("already closed") 206 207 def __repr__(self): 208 return "%s(%d)" % (self.__class__.__name__, int(self)) 209 210 __del__ = Close 211else: 212 # When select or poll has indicated that the file is writable, 213 # we can write up to _PIPE_BUF bytes without risk of blocking. 214 # POSIX defines PIPE_BUF as >= 512. 215 _PIPE_BUF = getattr(select, 'PIPE_BUF', 512) 216 217 # poll/select have the advantage of not requiring any extra file 218 # descriptor, contrarily to epoll/kqueue (also, they require a single 219 # syscall). 220 if hasattr(selectors, 'PollSelector'): 221 _PopenSelector = selectors.PollSelector 222 else: 223 _PopenSelector = selectors.SelectSelector 224 225 226if _mswindows: 227 # On Windows we just need to close `Popen._handle` when we no longer need 228 # it, so that the kernel can free it. `Popen._handle` gets closed 229 # implicitly when the `Popen` instance is finalized (see `Handle.__del__`, 230 # which is calling `CloseHandle` as requested in [1]), so there is nothing 231 # for `_cleanup` to do. 232 # 233 # [1] https://docs.microsoft.com/en-us/windows/desktop/ProcThread/ 234 # creating-processes 235 _active = None 236 237 def _cleanup(): 238 pass 239else: 240 # This lists holds Popen instances for which the underlying process had not 241 # exited at the time its __del__ method got called: those processes are 242 # wait()ed for synchronously from _cleanup() when a new Popen object is 243 # created, to avoid zombie processes. 244 _active = [] 245 246 def _cleanup(): 247 if _active is None: 248 return 249 for inst in _active[:]: 250 res = inst._internal_poll(_deadstate=sys.maxsize) 251 if res is not None: 252 try: 253 _active.remove(inst) 254 except ValueError: 255 # This can happen if two threads create a new Popen instance. 256 # It's harmless that it was already removed, so ignore. 257 pass 258 259PIPE = -1 260STDOUT = -2 261DEVNULL = -3 262 263 264# XXX This function is only used by multiprocessing and the test suite, 265# but it's here so that it can be imported when Python is compiled without 266# threads. 267 268def _optim_args_from_interpreter_flags(): 269 """Return a list of command-line arguments reproducing the current 270 optimization settings in sys.flags.""" 271 args = [] 272 value = sys.flags.optimize 273 if value > 0: 274 args.append('-' + 'O' * value) 275 return args 276 277 278def _args_from_interpreter_flags(): 279 """Return a list of command-line arguments reproducing the current 280 settings in sys.flags, sys.warnoptions and sys._xoptions.""" 281 flag_opt_map = { 282 'debug': 'd', 283 # 'inspect': 'i', 284 # 'interactive': 'i', 285 'dont_write_bytecode': 'B', 286 'no_site': 'S', 287 'verbose': 'v', 288 'bytes_warning': 'b', 289 'quiet': 'q', 290 # -O is handled in _optim_args_from_interpreter_flags() 291 } 292 args = _optim_args_from_interpreter_flags() 293 for flag, opt in flag_opt_map.items(): 294 v = getattr(sys.flags, flag) 295 if v > 0: 296 args.append('-' + opt * v) 297 298 if sys.flags.isolated: 299 args.append('-I') 300 else: 301 if sys.flags.ignore_environment: 302 args.append('-E') 303 if sys.flags.no_user_site: 304 args.append('-s') 305 306 # -W options 307 warnopts = sys.warnoptions[:] 308 bytes_warning = sys.flags.bytes_warning 309 xoptions = getattr(sys, '_xoptions', {}) 310 dev_mode = ('dev' in xoptions) 311 312 if bytes_warning > 1: 313 warnopts.remove("error::BytesWarning") 314 elif bytes_warning: 315 warnopts.remove("default::BytesWarning") 316 if dev_mode: 317 warnopts.remove('default') 318 for opt in warnopts: 319 args.append('-W' + opt) 320 321 # -X options 322 if dev_mode: 323 args.extend(('-X', 'dev')) 324 for opt in ('faulthandler', 'tracemalloc', 'importtime', 325 'showrefcount', 'utf8'): 326 if opt in xoptions: 327 value = xoptions[opt] 328 if value is True: 329 arg = opt 330 else: 331 arg = '%s=%s' % (opt, value) 332 args.extend(('-X', arg)) 333 334 return args 335 336 337def call(*popenargs, timeout=None, **kwargs): 338 """Run command with arguments. Wait for command to complete or 339 timeout, then return the returncode attribute. 340 341 The arguments are the same as for the Popen constructor. Example: 342 343 retcode = call(["ls", "-l"]) 344 """ 345 with Popen(*popenargs, **kwargs) as p: 346 try: 347 return p.wait(timeout=timeout) 348 except: # Including KeyboardInterrupt, wait handled that. 349 p.kill() 350 # We don't call p.wait() again as p.__exit__ does that for us. 351 raise 352 353 354def check_call(*popenargs, **kwargs): 355 """Run command with arguments. Wait for command to complete. If 356 the exit code was zero then return, otherwise raise 357 CalledProcessError. The CalledProcessError object will have the 358 return code in the returncode attribute. 359 360 The arguments are the same as for the call function. Example: 361 362 check_call(["ls", "-l"]) 363 """ 364 retcode = call(*popenargs, **kwargs) 365 if retcode: 366 cmd = kwargs.get("args") 367 if cmd is None: 368 cmd = popenargs[0] 369 raise CalledProcessError(retcode, cmd) 370 return 0 371 372 373def check_output(*popenargs, timeout=None, **kwargs): 374 r"""Run command with arguments and return its output. 375 376 If the exit code was non-zero it raises a CalledProcessError. The 377 CalledProcessError object will have the return code in the returncode 378 attribute and output in the output attribute. 379 380 The arguments are the same as for the Popen constructor. Example: 381 382 >>> check_output(["ls", "-l", "/dev/null"]) 383 b'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n' 384 385 The stdout argument is not allowed as it is used internally. 386 To capture standard error in the result, use stderr=STDOUT. 387 388 >>> check_output(["/bin/sh", "-c", 389 ... "ls -l non_existent_file ; exit 0"], 390 ... stderr=STDOUT) 391 b'ls: non_existent_file: No such file or directory\n' 392 393 There is an additional optional argument, "input", allowing you to 394 pass a string to the subprocess's stdin. If you use this argument 395 you may not also use the Popen constructor's "stdin" argument, as 396 it too will be used internally. Example: 397 398 >>> check_output(["sed", "-e", "s/foo/bar/"], 399 ... input=b"when in the course of fooman events\n") 400 b'when in the course of barman events\n' 401 402 By default, all communication is in bytes, and therefore any "input" 403 should be bytes, and the return value will be bytes. If in text mode, 404 any "input" should be a string, and the return value will be a string 405 decoded according to locale encoding, or by "encoding" if set. Text mode 406 is triggered by setting any of text, encoding, errors or universal_newlines. 407 """ 408 if 'stdout' in kwargs: 409 raise ValueError('stdout argument not allowed, it will be overridden.') 410 411 if 'input' in kwargs and kwargs['input'] is None: 412 # Explicitly passing input=None was previously equivalent to passing an 413 # empty string. That is maintained here for backwards compatibility. 414 if kwargs.get('universal_newlines') or kwargs.get('text'): 415 empty = '' 416 else: 417 empty = b'' 418 kwargs['input'] = empty 419 420 return run(*popenargs, stdout=PIPE, timeout=timeout, check=True, 421 **kwargs).stdout 422 423 424class CompletedProcess(object): 425 """A process that has finished running. 426 427 This is returned by run(). 428 429 Attributes: 430 args: The list or str args passed to run(). 431 returncode: The exit code of the process, negative for signals. 432 stdout: The standard output (None if not captured). 433 stderr: The standard error (None if not captured). 434 """ 435 def __init__(self, args, returncode, stdout=None, stderr=None): 436 self.args = args 437 self.returncode = returncode 438 self.stdout = stdout 439 self.stderr = stderr 440 441 def __repr__(self): 442 args = ['args={!r}'.format(self.args), 443 'returncode={!r}'.format(self.returncode)] 444 if self.stdout is not None: 445 args.append('stdout={!r}'.format(self.stdout)) 446 if self.stderr is not None: 447 args.append('stderr={!r}'.format(self.stderr)) 448 return "{}({})".format(type(self).__name__, ', '.join(args)) 449 450 __class_getitem__ = classmethod(types.GenericAlias) 451 452 453 def check_returncode(self): 454 """Raise CalledProcessError if the exit code is non-zero.""" 455 if self.returncode: 456 raise CalledProcessError(self.returncode, self.args, self.stdout, 457 self.stderr) 458 459 460def run(*popenargs, 461 input=None, capture_output=False, timeout=None, check=False, **kwargs): 462 """Run command with arguments and return a CompletedProcess instance. 463 464 The returned instance will have attributes args, returncode, stdout and 465 stderr. By default, stdout and stderr are not captured, and those attributes 466 will be None. Pass stdout=PIPE and/or stderr=PIPE in order to capture them. 467 468 If check is True and the exit code was non-zero, it raises a 469 CalledProcessError. The CalledProcessError object will have the return code 470 in the returncode attribute, and output & stderr attributes if those streams 471 were captured. 472 473 If timeout is given, and the process takes too long, a TimeoutExpired 474 exception will be raised. 475 476 There is an optional argument "input", allowing you to 477 pass bytes or a string to the subprocess's stdin. If you use this argument 478 you may not also use the Popen constructor's "stdin" argument, as 479 it will be used internally. 480 481 By default, all communication is in bytes, and therefore any "input" should 482 be bytes, and the stdout and stderr will be bytes. If in text mode, any 483 "input" should be a string, and stdout and stderr will be strings decoded 484 according to locale encoding, or by "encoding" if set. Text mode is 485 triggered by setting any of text, encoding, errors or universal_newlines. 486 487 The other arguments are the same as for the Popen constructor. 488 """ 489 if input is not None: 490 if kwargs.get('stdin') is not None: 491 raise ValueError('stdin and input arguments may not both be used.') 492 kwargs['stdin'] = PIPE 493 494 if capture_output: 495 if kwargs.get('stdout') is not None or kwargs.get('stderr') is not None: 496 raise ValueError('stdout and stderr arguments may not be used ' 497 'with capture_output.') 498 kwargs['stdout'] = PIPE 499 kwargs['stderr'] = PIPE 500 501 with Popen(*popenargs, **kwargs) as process: 502 try: 503 stdout, stderr = process.communicate(input, timeout=timeout) 504 except TimeoutExpired as exc: 505 process.kill() 506 if _mswindows: 507 # Windows accumulates the output in a single blocking 508 # read() call run on child threads, with the timeout 509 # being done in a join() on those threads. communicate() 510 # _after_ kill() is required to collect that and add it 511 # to the exception. 512 exc.stdout, exc.stderr = process.communicate() 513 else: 514 # POSIX _communicate already populated the output so 515 # far into the TimeoutExpired exception. 516 process.wait() 517 raise 518 except: # Including KeyboardInterrupt, communicate handled that. 519 process.kill() 520 # We don't call process.wait() as .__exit__ does that for us. 521 raise 522 retcode = process.poll() 523 if check and retcode: 524 raise CalledProcessError(retcode, process.args, 525 output=stdout, stderr=stderr) 526 return CompletedProcess(process.args, retcode, stdout, stderr) 527 528 529def list2cmdline(seq): 530 """ 531 Translate a sequence of arguments into a command line 532 string, using the same rules as the MS C runtime: 533 534 1) Arguments are delimited by white space, which is either a 535 space or a tab. 536 537 2) A string surrounded by double quotation marks is 538 interpreted as a single argument, regardless of white space 539 contained within. A quoted string can be embedded in an 540 argument. 541 542 3) A double quotation mark preceded by a backslash is 543 interpreted as a literal double quotation mark. 544 545 4) Backslashes are interpreted literally, unless they 546 immediately precede a double quotation mark. 547 548 5) If backslashes immediately precede a double quotation mark, 549 every pair of backslashes is interpreted as a literal 550 backslash. If the number of backslashes is odd, the last 551 backslash escapes the next double quotation mark as 552 described in rule 3. 553 """ 554 555 # See 556 # http://msdn.microsoft.com/en-us/library/17w5ykft.aspx 557 # or search http://msdn.microsoft.com for 558 # "Parsing C++ Command-Line Arguments" 559 result = [] 560 needquote = False 561 for arg in map(os.fsdecode, seq): 562 bs_buf = [] 563 564 # Add a space to separate this argument from the others 565 if result: 566 result.append(' ') 567 568 needquote = (" " in arg) or ("\t" in arg) or not arg 569 if needquote: 570 result.append('"') 571 572 for c in arg: 573 if c == '\\': 574 # Don't know if we need to double yet. 575 bs_buf.append(c) 576 elif c == '"': 577 # Double backslashes. 578 result.append('\\' * len(bs_buf)*2) 579 bs_buf = [] 580 result.append('\\"') 581 else: 582 # Normal char 583 if bs_buf: 584 result.extend(bs_buf) 585 bs_buf = [] 586 result.append(c) 587 588 # Add remaining backslashes, if any. 589 if bs_buf: 590 result.extend(bs_buf) 591 592 if needquote: 593 result.extend(bs_buf) 594 result.append('"') 595 596 return ''.join(result) 597 598 599# Various tools for executing commands and looking at their output and status. 600# 601 602def getstatusoutput(cmd): 603 """Return (exitcode, output) of executing cmd in a shell. 604 605 Execute the string 'cmd' in a shell with 'check_output' and 606 return a 2-tuple (status, output). The locale encoding is used 607 to decode the output and process newlines. 608 609 A trailing newline is stripped from the output. 610 The exit status for the command can be interpreted 611 according to the rules for the function 'wait'. Example: 612 613 >>> import subprocess 614 >>> subprocess.getstatusoutput('ls /bin/ls') 615 (0, '/bin/ls') 616 >>> subprocess.getstatusoutput('cat /bin/junk') 617 (1, 'cat: /bin/junk: No such file or directory') 618 >>> subprocess.getstatusoutput('/bin/junk') 619 (127, 'sh: /bin/junk: not found') 620 >>> subprocess.getstatusoutput('/bin/kill $$') 621 (-15, '') 622 """ 623 try: 624 data = check_output(cmd, shell=True, text=True, stderr=STDOUT) 625 exitcode = 0 626 except CalledProcessError as ex: 627 data = ex.output 628 exitcode = ex.returncode 629 if data[-1:] == '\n': 630 data = data[:-1] 631 return exitcode, data 632 633def getoutput(cmd): 634 """Return output (stdout or stderr) of executing cmd in a shell. 635 636 Like getstatusoutput(), except the exit status is ignored and the return 637 value is a string containing the command's output. Example: 638 639 >>> import subprocess 640 >>> subprocess.getoutput('ls /bin/ls') 641 '/bin/ls' 642 """ 643 return getstatusoutput(cmd)[1] 644 645 646def _use_posix_spawn(): 647 """Check if posix_spawn() can be used for subprocess. 648 649 subprocess requires a posix_spawn() implementation that properly reports 650 errors to the parent process, & sets errno on the following failures: 651 652 * Process attribute actions failed. 653 * File actions failed. 654 * exec() failed. 655 656 Prefer an implementation which can use vfork() in some cases for best 657 performance. 658 """ 659 if _mswindows or not hasattr(os, 'posix_spawn'): 660 # os.posix_spawn() is not available 661 return False 662 663 if sys.platform in ('darwin', 'sunos5'): 664 # posix_spawn() is a syscall on both macOS and Solaris, 665 # and properly reports errors 666 return True 667 668 # Check libc name and runtime libc version 669 try: 670 ver = os.confstr('CS_GNU_LIBC_VERSION') 671 # parse 'glibc 2.28' as ('glibc', (2, 28)) 672 parts = ver.split(maxsplit=1) 673 if len(parts) != 2: 674 # reject unknown format 675 raise ValueError 676 libc = parts[0] 677 version = tuple(map(int, parts[1].split('.'))) 678 679 if sys.platform == 'linux' and libc == 'glibc' and version >= (2, 24): 680 # glibc 2.24 has a new Linux posix_spawn implementation using vfork 681 # which properly reports errors to the parent process. 682 return True 683 # Note: Don't use the implementation in earlier glibc because it doesn't 684 # use vfork (even if glibc 2.26 added a pipe to properly report errors 685 # to the parent process). 686 except (AttributeError, ValueError, OSError): 687 # os.confstr() or CS_GNU_LIBC_VERSION value not available 688 pass 689 690 # By default, assume that posix_spawn() does not properly report errors. 691 return False 692 693 694_USE_POSIX_SPAWN = _use_posix_spawn() 695 696 697class Popen: 698 """ Execute a child program in a new process. 699 700 For a complete description of the arguments see the Python documentation. 701 702 Arguments: 703 args: A string, or a sequence of program arguments. 704 705 bufsize: supplied as the buffering argument to the open() function when 706 creating the stdin/stdout/stderr pipe file objects 707 708 executable: A replacement program to execute. 709 710 stdin, stdout and stderr: These specify the executed programs' standard 711 input, standard output and standard error file handles, respectively. 712 713 preexec_fn: (POSIX only) An object to be called in the child process 714 just before the child is executed. 715 716 close_fds: Controls closing or inheriting of file descriptors. 717 718 shell: If true, the command will be executed through the shell. 719 720 cwd: Sets the current directory before the child is executed. 721 722 env: Defines the environment variables for the new process. 723 724 text: If true, decode stdin, stdout and stderr using the given encoding 725 (if set) or the system default otherwise. 726 727 universal_newlines: Alias of text, provided for backwards compatibility. 728 729 startupinfo and creationflags (Windows only) 730 731 restore_signals (POSIX only) 732 733 start_new_session (POSIX only) 734 735 group (POSIX only) 736 737 extra_groups (POSIX only) 738 739 user (POSIX only) 740 741 umask (POSIX only) 742 743 pass_fds (POSIX only) 744 745 encoding and errors: Text mode encoding and error handling to use for 746 file objects stdin, stdout and stderr. 747 748 Attributes: 749 stdin, stdout, stderr, pid, returncode 750 """ 751 _child_created = False # Set here since __del__ checks it 752 753 def __init__(self, args, bufsize=-1, executable=None, 754 stdin=None, stdout=None, stderr=None, 755 preexec_fn=None, close_fds=True, 756 shell=False, cwd=None, env=None, universal_newlines=None, 757 startupinfo=None, creationflags=0, 758 restore_signals=True, start_new_session=False, 759 pass_fds=(), *, user=None, group=None, extra_groups=None, 760 encoding=None, errors=None, text=None, umask=-1, pipesize=-1): 761 """Create new Popen instance.""" 762 _cleanup() 763 # Held while anything is calling waitpid before returncode has been 764 # updated to prevent clobbering returncode if wait() or poll() are 765 # called from multiple threads at once. After acquiring the lock, 766 # code must re-check self.returncode to see if another thread just 767 # finished a waitpid() call. 768 self._waitpid_lock = threading.Lock() 769 770 self._input = None 771 self._communication_started = False 772 if bufsize is None: 773 bufsize = -1 # Restore default 774 if not isinstance(bufsize, int): 775 raise TypeError("bufsize must be an integer") 776 777 if pipesize is None: 778 pipesize = -1 # Restore default 779 if not isinstance(pipesize, int): 780 raise TypeError("pipesize must be an integer") 781 782 if _mswindows: 783 if preexec_fn is not None: 784 raise ValueError("preexec_fn is not supported on Windows " 785 "platforms") 786 else: 787 # POSIX 788 if pass_fds and not close_fds: 789 warnings.warn("pass_fds overriding close_fds.", RuntimeWarning) 790 close_fds = True 791 if startupinfo is not None: 792 raise ValueError("startupinfo is only supported on Windows " 793 "platforms") 794 if creationflags != 0: 795 raise ValueError("creationflags is only supported on Windows " 796 "platforms") 797 798 self.args = args 799 self.stdin = None 800 self.stdout = None 801 self.stderr = None 802 self.pid = None 803 self.returncode = None 804 self.encoding = encoding 805 self.errors = errors 806 self.pipesize = pipesize 807 808 # Validate the combinations of text and universal_newlines 809 if (text is not None and universal_newlines is not None 810 and bool(universal_newlines) != bool(text)): 811 raise SubprocessError('Cannot disambiguate when both text ' 812 'and universal_newlines are supplied but ' 813 'different. Pass one or the other.') 814 815 # Input and output objects. The general principle is like 816 # this: 817 # 818 # Parent Child 819 # ------ ----- 820 # p2cwrite ---stdin---> p2cread 821 # c2pread <--stdout--- c2pwrite 822 # errread <--stderr--- errwrite 823 # 824 # On POSIX, the child objects are file descriptors. On 825 # Windows, these are Windows file handles. The parent objects 826 # are file descriptors on both platforms. The parent objects 827 # are -1 when not using PIPEs. The child objects are -1 828 # when not redirecting. 829 830 (p2cread, p2cwrite, 831 c2pread, c2pwrite, 832 errread, errwrite) = self._get_handles(stdin, stdout, stderr) 833 834 # We wrap OS handles *before* launching the child, otherwise a 835 # quickly terminating child could make our fds unwrappable 836 # (see #8458). 837 838 if _mswindows: 839 if p2cwrite != -1: 840 p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0) 841 if c2pread != -1: 842 c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0) 843 if errread != -1: 844 errread = msvcrt.open_osfhandle(errread.Detach(), 0) 845 846 self.text_mode = encoding or errors or text or universal_newlines 847 848 # PEP 597: We suppress the EncodingWarning in subprocess module 849 # for now (at Python 3.10), because we focus on files for now. 850 # This will be changed to encoding = io.text_encoding(encoding) 851 # in the future. 852 if self.text_mode and encoding is None: 853 self.encoding = encoding = "locale" 854 855 # How long to resume waiting on a child after the first ^C. 856 # There is no right value for this. The purpose is to be polite 857 # yet remain good for interactive users trying to exit a tool. 858 self._sigint_wait_secs = 0.25 # 1/xkcd221.getRandomNumber() 859 860 self._closed_child_pipe_fds = False 861 862 if self.text_mode: 863 if bufsize == 1: 864 line_buffering = True 865 # Use the default buffer size for the underlying binary streams 866 # since they don't support line buffering. 867 bufsize = -1 868 else: 869 line_buffering = False 870 871 gid = None 872 if group is not None: 873 if not hasattr(os, 'setregid'): 874 raise ValueError("The 'group' parameter is not supported on the " 875 "current platform") 876 877 elif isinstance(group, str): 878 try: 879 import grp 880 except ImportError: 881 raise ValueError("The group parameter cannot be a string " 882 "on systems without the grp module") 883 884 gid = grp.getgrnam(group).gr_gid 885 elif isinstance(group, int): 886 gid = group 887 else: 888 raise TypeError("Group must be a string or an integer, not {}" 889 .format(type(group))) 890 891 if gid < 0: 892 raise ValueError(f"Group ID cannot be negative, got {gid}") 893 894 gids = None 895 if extra_groups is not None: 896 if not hasattr(os, 'setgroups'): 897 raise ValueError("The 'extra_groups' parameter is not " 898 "supported on the current platform") 899 900 elif isinstance(extra_groups, str): 901 raise ValueError("Groups must be a list, not a string") 902 903 gids = [] 904 for extra_group in extra_groups: 905 if isinstance(extra_group, str): 906 try: 907 import grp 908 except ImportError: 909 raise ValueError("Items in extra_groups cannot be " 910 "strings on systems without the " 911 "grp module") 912 913 gids.append(grp.getgrnam(extra_group).gr_gid) 914 elif isinstance(extra_group, int): 915 gids.append(extra_group) 916 else: 917 raise TypeError("Items in extra_groups must be a string " 918 "or integer, not {}" 919 .format(type(extra_group))) 920 921 # make sure that the gids are all positive here so we can do less 922 # checking in the C code 923 for gid_check in gids: 924 if gid_check < 0: 925 raise ValueError(f"Group ID cannot be negative, got {gid_check}") 926 927 uid = None 928 if user is not None: 929 if not hasattr(os, 'setreuid'): 930 raise ValueError("The 'user' parameter is not supported on " 931 "the current platform") 932 933 elif isinstance(user, str): 934 try: 935 import pwd 936 except ImportError: 937 raise ValueError("The user parameter cannot be a string " 938 "on systems without the pwd module") 939 uid = pwd.getpwnam(user).pw_uid 940 elif isinstance(user, int): 941 uid = user 942 else: 943 raise TypeError("User must be a string or an integer") 944 945 if uid < 0: 946 raise ValueError(f"User ID cannot be negative, got {uid}") 947 948 try: 949 if p2cwrite != -1: 950 self.stdin = io.open(p2cwrite, 'wb', bufsize) 951 if self.text_mode: 952 self.stdin = io.TextIOWrapper(self.stdin, write_through=True, 953 line_buffering=line_buffering, 954 encoding=encoding, errors=errors) 955 if c2pread != -1: 956 self.stdout = io.open(c2pread, 'rb', bufsize) 957 if self.text_mode: 958 self.stdout = io.TextIOWrapper(self.stdout, 959 encoding=encoding, errors=errors) 960 if errread != -1: 961 self.stderr = io.open(errread, 'rb', bufsize) 962 if self.text_mode: 963 self.stderr = io.TextIOWrapper(self.stderr, 964 encoding=encoding, errors=errors) 965 966 self._execute_child(args, executable, preexec_fn, close_fds, 967 pass_fds, cwd, env, 968 startupinfo, creationflags, shell, 969 p2cread, p2cwrite, 970 c2pread, c2pwrite, 971 errread, errwrite, 972 restore_signals, 973 gid, gids, uid, umask, 974 start_new_session) 975 except: 976 # Cleanup if the child failed starting. 977 for f in filter(None, (self.stdin, self.stdout, self.stderr)): 978 try: 979 f.close() 980 except OSError: 981 pass # Ignore EBADF or other errors. 982 983 if not self._closed_child_pipe_fds: 984 to_close = [] 985 if stdin == PIPE: 986 to_close.append(p2cread) 987 if stdout == PIPE: 988 to_close.append(c2pwrite) 989 if stderr == PIPE: 990 to_close.append(errwrite) 991 if hasattr(self, '_devnull'): 992 to_close.append(self._devnull) 993 for fd in to_close: 994 try: 995 if _mswindows and isinstance(fd, Handle): 996 fd.Close() 997 else: 998 os.close(fd) 999 except OSError: 1000 pass 1001 1002 raise 1003 1004 def __repr__(self): 1005 obj_repr = ( 1006 f"<{self.__class__.__name__}: " 1007 f"returncode: {self.returncode} args: {self.args!r}>" 1008 ) 1009 if len(obj_repr) > 80: 1010 obj_repr = obj_repr[:76] + "...>" 1011 return obj_repr 1012 1013 __class_getitem__ = classmethod(types.GenericAlias) 1014 1015 @property 1016 def universal_newlines(self): 1017 # universal_newlines as retained as an alias of text_mode for API 1018 # compatibility. bpo-31756 1019 return self.text_mode 1020 1021 @universal_newlines.setter 1022 def universal_newlines(self, universal_newlines): 1023 self.text_mode = bool(universal_newlines) 1024 1025 def _translate_newlines(self, data, encoding, errors): 1026 data = data.decode(encoding, errors) 1027 return data.replace("\r\n", "\n").replace("\r", "\n") 1028 1029 def __enter__(self): 1030 return self 1031 1032 def __exit__(self, exc_type, value, traceback): 1033 if self.stdout: 1034 self.stdout.close() 1035 if self.stderr: 1036 self.stderr.close() 1037 try: # Flushing a BufferedWriter may raise an error 1038 if self.stdin: 1039 self.stdin.close() 1040 finally: 1041 if exc_type == KeyboardInterrupt: 1042 # https://bugs.python.org/issue25942 1043 # In the case of a KeyboardInterrupt we assume the SIGINT 1044 # was also already sent to our child processes. We can't 1045 # block indefinitely as that is not user friendly. 1046 # If we have not already waited a brief amount of time in 1047 # an interrupted .wait() or .communicate() call, do so here 1048 # for consistency. 1049 if self._sigint_wait_secs > 0: 1050 try: 1051 self._wait(timeout=self._sigint_wait_secs) 1052 except TimeoutExpired: 1053 pass 1054 self._sigint_wait_secs = 0 # Note that this has been done. 1055 return # resume the KeyboardInterrupt 1056 1057 # Wait for the process to terminate, to avoid zombies. 1058 self.wait() 1059 1060 def __del__(self, _maxsize=sys.maxsize, _warn=warnings.warn): 1061 if not self._child_created: 1062 # We didn't get to successfully create a child process. 1063 return 1064 if self.returncode is None: 1065 # Not reading subprocess exit status creates a zombie process which 1066 # is only destroyed at the parent python process exit 1067 _warn("subprocess %s is still running" % self.pid, 1068 ResourceWarning, source=self) 1069 # In case the child hasn't been waited on, check if it's done. 1070 self._internal_poll(_deadstate=_maxsize) 1071 if self.returncode is None and _active is not None: 1072 # Child is still running, keep us alive until we can wait on it. 1073 _active.append(self) 1074 1075 def _get_devnull(self): 1076 if not hasattr(self, '_devnull'): 1077 self._devnull = os.open(os.devnull, os.O_RDWR) 1078 return self._devnull 1079 1080 def _stdin_write(self, input): 1081 if input: 1082 try: 1083 self.stdin.write(input) 1084 except BrokenPipeError: 1085 pass # communicate() must ignore broken pipe errors. 1086 except OSError as exc: 1087 if exc.errno == errno.EINVAL: 1088 # bpo-19612, bpo-30418: On Windows, stdin.write() fails 1089 # with EINVAL if the child process exited or if the child 1090 # process is still running but closed the pipe. 1091 pass 1092 else: 1093 raise 1094 1095 try: 1096 self.stdin.close() 1097 except BrokenPipeError: 1098 pass # communicate() must ignore broken pipe errors. 1099 except OSError as exc: 1100 if exc.errno == errno.EINVAL: 1101 pass 1102 else: 1103 raise 1104 1105 def communicate(self, input=None, timeout=None): 1106 """Interact with process: Send data to stdin and close it. 1107 Read data from stdout and stderr, until end-of-file is 1108 reached. Wait for process to terminate. 1109 1110 The optional "input" argument should be data to be sent to the 1111 child process, or None, if no data should be sent to the child. 1112 communicate() returns a tuple (stdout, stderr). 1113 1114 By default, all communication is in bytes, and therefore any 1115 "input" should be bytes, and the (stdout, stderr) will be bytes. 1116 If in text mode (indicated by self.text_mode), any "input" should 1117 be a string, and (stdout, stderr) will be strings decoded 1118 according to locale encoding, or by "encoding" if set. Text mode 1119 is triggered by setting any of text, encoding, errors or 1120 universal_newlines. 1121 """ 1122 1123 if self._communication_started and input: 1124 raise ValueError("Cannot send input after starting communication") 1125 1126 # Optimization: If we are not worried about timeouts, we haven't 1127 # started communicating, and we have one or zero pipes, using select() 1128 # or threads is unnecessary. 1129 if (timeout is None and not self._communication_started and 1130 [self.stdin, self.stdout, self.stderr].count(None) >= 2): 1131 stdout = None 1132 stderr = None 1133 if self.stdin: 1134 self._stdin_write(input) 1135 elif self.stdout: 1136 stdout = self.stdout.read() 1137 self.stdout.close() 1138 elif self.stderr: 1139 stderr = self.stderr.read() 1140 self.stderr.close() 1141 self.wait() 1142 else: 1143 if timeout is not None: 1144 endtime = _time() + timeout 1145 else: 1146 endtime = None 1147 1148 try: 1149 stdout, stderr = self._communicate(input, endtime, timeout) 1150 except KeyboardInterrupt: 1151 # https://bugs.python.org/issue25942 1152 # See the detailed comment in .wait(). 1153 if timeout is not None: 1154 sigint_timeout = min(self._sigint_wait_secs, 1155 self._remaining_time(endtime)) 1156 else: 1157 sigint_timeout = self._sigint_wait_secs 1158 self._sigint_wait_secs = 0 # nothing else should wait. 1159 try: 1160 self._wait(timeout=sigint_timeout) 1161 except TimeoutExpired: 1162 pass 1163 raise # resume the KeyboardInterrupt 1164 1165 finally: 1166 self._communication_started = True 1167 1168 sts = self.wait(timeout=self._remaining_time(endtime)) 1169 1170 return (stdout, stderr) 1171 1172 1173 def poll(self): 1174 """Check if child process has terminated. Set and return returncode 1175 attribute.""" 1176 return self._internal_poll() 1177 1178 1179 def _remaining_time(self, endtime): 1180 """Convenience for _communicate when computing timeouts.""" 1181 if endtime is None: 1182 return None 1183 else: 1184 return endtime - _time() 1185 1186 1187 def _check_timeout(self, endtime, orig_timeout, stdout_seq, stderr_seq, 1188 skip_check_and_raise=False): 1189 """Convenience for checking if a timeout has expired.""" 1190 if endtime is None: 1191 return 1192 if skip_check_and_raise or _time() > endtime: 1193 raise TimeoutExpired( 1194 self.args, orig_timeout, 1195 output=b''.join(stdout_seq) if stdout_seq else None, 1196 stderr=b''.join(stderr_seq) if stderr_seq else None) 1197 1198 1199 def wait(self, timeout=None): 1200 """Wait for child process to terminate; returns self.returncode.""" 1201 if timeout is not None: 1202 endtime = _time() + timeout 1203 try: 1204 return self._wait(timeout=timeout) 1205 except KeyboardInterrupt: 1206 # https://bugs.python.org/issue25942 1207 # The first keyboard interrupt waits briefly for the child to 1208 # exit under the common assumption that it also received the ^C 1209 # generated SIGINT and will exit rapidly. 1210 if timeout is not None: 1211 sigint_timeout = min(self._sigint_wait_secs, 1212 self._remaining_time(endtime)) 1213 else: 1214 sigint_timeout = self._sigint_wait_secs 1215 self._sigint_wait_secs = 0 # nothing else should wait. 1216 try: 1217 self._wait(timeout=sigint_timeout) 1218 except TimeoutExpired: 1219 pass 1220 raise # resume the KeyboardInterrupt 1221 1222 def _close_pipe_fds(self, 1223 p2cread, p2cwrite, 1224 c2pread, c2pwrite, 1225 errread, errwrite): 1226 # self._devnull is not always defined. 1227 devnull_fd = getattr(self, '_devnull', None) 1228 1229 with contextlib.ExitStack() as stack: 1230 if _mswindows: 1231 if p2cread != -1: 1232 stack.callback(p2cread.Close) 1233 if c2pwrite != -1: 1234 stack.callback(c2pwrite.Close) 1235 if errwrite != -1: 1236 stack.callback(errwrite.Close) 1237 else: 1238 if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd: 1239 stack.callback(os.close, p2cread) 1240 if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd: 1241 stack.callback(os.close, c2pwrite) 1242 if errwrite != -1 and errread != -1 and errwrite != devnull_fd: 1243 stack.callback(os.close, errwrite) 1244 1245 if devnull_fd is not None: 1246 stack.callback(os.close, devnull_fd) 1247 1248 # Prevent a double close of these handles/fds from __init__ on error. 1249 self._closed_child_pipe_fds = True 1250 1251 if _mswindows: 1252 # 1253 # Windows methods 1254 # 1255 def _get_handles(self, stdin, stdout, stderr): 1256 """Construct and return tuple with IO objects: 1257 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite 1258 """ 1259 if stdin is None and stdout is None and stderr is None: 1260 return (-1, -1, -1, -1, -1, -1) 1261 1262 p2cread, p2cwrite = -1, -1 1263 c2pread, c2pwrite = -1, -1 1264 errread, errwrite = -1, -1 1265 1266 if stdin is None: 1267 p2cread = _winapi.GetStdHandle(_winapi.STD_INPUT_HANDLE) 1268 if p2cread is None: 1269 p2cread, _ = _winapi.CreatePipe(None, 0) 1270 p2cread = Handle(p2cread) 1271 _winapi.CloseHandle(_) 1272 elif stdin == PIPE: 1273 p2cread, p2cwrite = _winapi.CreatePipe(None, 0) 1274 p2cread, p2cwrite = Handle(p2cread), Handle(p2cwrite) 1275 elif stdin == DEVNULL: 1276 p2cread = msvcrt.get_osfhandle(self._get_devnull()) 1277 elif isinstance(stdin, int): 1278 p2cread = msvcrt.get_osfhandle(stdin) 1279 else: 1280 # Assuming file-like object 1281 p2cread = msvcrt.get_osfhandle(stdin.fileno()) 1282 p2cread = self._make_inheritable(p2cread) 1283 1284 if stdout is None: 1285 c2pwrite = _winapi.GetStdHandle(_winapi.STD_OUTPUT_HANDLE) 1286 if c2pwrite is None: 1287 _, c2pwrite = _winapi.CreatePipe(None, 0) 1288 c2pwrite = Handle(c2pwrite) 1289 _winapi.CloseHandle(_) 1290 elif stdout == PIPE: 1291 c2pread, c2pwrite = _winapi.CreatePipe(None, 0) 1292 c2pread, c2pwrite = Handle(c2pread), Handle(c2pwrite) 1293 elif stdout == DEVNULL: 1294 c2pwrite = msvcrt.get_osfhandle(self._get_devnull()) 1295 elif isinstance(stdout, int): 1296 c2pwrite = msvcrt.get_osfhandle(stdout) 1297 else: 1298 # Assuming file-like object 1299 c2pwrite = msvcrt.get_osfhandle(stdout.fileno()) 1300 c2pwrite = self._make_inheritable(c2pwrite) 1301 1302 if stderr is None: 1303 errwrite = _winapi.GetStdHandle(_winapi.STD_ERROR_HANDLE) 1304 if errwrite is None: 1305 _, errwrite = _winapi.CreatePipe(None, 0) 1306 errwrite = Handle(errwrite) 1307 _winapi.CloseHandle(_) 1308 elif stderr == PIPE: 1309 errread, errwrite = _winapi.CreatePipe(None, 0) 1310 errread, errwrite = Handle(errread), Handle(errwrite) 1311 elif stderr == STDOUT: 1312 errwrite = c2pwrite 1313 elif stderr == DEVNULL: 1314 errwrite = msvcrt.get_osfhandle(self._get_devnull()) 1315 elif isinstance(stderr, int): 1316 errwrite = msvcrt.get_osfhandle(stderr) 1317 else: 1318 # Assuming file-like object 1319 errwrite = msvcrt.get_osfhandle(stderr.fileno()) 1320 errwrite = self._make_inheritable(errwrite) 1321 1322 return (p2cread, p2cwrite, 1323 c2pread, c2pwrite, 1324 errread, errwrite) 1325 1326 1327 def _make_inheritable(self, handle): 1328 """Return a duplicate of handle, which is inheritable""" 1329 h = _winapi.DuplicateHandle( 1330 _winapi.GetCurrentProcess(), handle, 1331 _winapi.GetCurrentProcess(), 0, 1, 1332 _winapi.DUPLICATE_SAME_ACCESS) 1333 return Handle(h) 1334 1335 1336 def _filter_handle_list(self, handle_list): 1337 """Filter out console handles that can't be used 1338 in lpAttributeList["handle_list"] and make sure the list 1339 isn't empty. This also removes duplicate handles.""" 1340 # An handle with it's lowest two bits set might be a special console 1341 # handle that if passed in lpAttributeList["handle_list"], will 1342 # cause it to fail. 1343 return list({handle for handle in handle_list 1344 if handle & 0x3 != 0x3 1345 or _winapi.GetFileType(handle) != 1346 _winapi.FILE_TYPE_CHAR}) 1347 1348 1349 def _execute_child(self, args, executable, preexec_fn, close_fds, 1350 pass_fds, cwd, env, 1351 startupinfo, creationflags, shell, 1352 p2cread, p2cwrite, 1353 c2pread, c2pwrite, 1354 errread, errwrite, 1355 unused_restore_signals, 1356 unused_gid, unused_gids, unused_uid, 1357 unused_umask, 1358 unused_start_new_session): 1359 """Execute program (MS Windows version)""" 1360 1361 assert not pass_fds, "pass_fds not supported on Windows." 1362 1363 if isinstance(args, str): 1364 pass 1365 elif isinstance(args, bytes): 1366 if shell: 1367 raise TypeError('bytes args is not allowed on Windows') 1368 args = list2cmdline([args]) 1369 elif isinstance(args, os.PathLike): 1370 if shell: 1371 raise TypeError('path-like args is not allowed when ' 1372 'shell is true') 1373 args = list2cmdline([args]) 1374 else: 1375 args = list2cmdline(args) 1376 1377 if executable is not None: 1378 executable = os.fsdecode(executable) 1379 1380 # Process startup details 1381 if startupinfo is None: 1382 startupinfo = STARTUPINFO() 1383 else: 1384 # bpo-34044: Copy STARTUPINFO since it is modified above, 1385 # so the caller can reuse it multiple times. 1386 startupinfo = startupinfo.copy() 1387 1388 use_std_handles = -1 not in (p2cread, c2pwrite, errwrite) 1389 if use_std_handles: 1390 startupinfo.dwFlags |= _winapi.STARTF_USESTDHANDLES 1391 startupinfo.hStdInput = p2cread 1392 startupinfo.hStdOutput = c2pwrite 1393 startupinfo.hStdError = errwrite 1394 1395 attribute_list = startupinfo.lpAttributeList 1396 have_handle_list = bool(attribute_list and 1397 "handle_list" in attribute_list and 1398 attribute_list["handle_list"]) 1399 1400 # If we were given an handle_list or need to create one 1401 if have_handle_list or (use_std_handles and close_fds): 1402 if attribute_list is None: 1403 attribute_list = startupinfo.lpAttributeList = {} 1404 handle_list = attribute_list["handle_list"] = \ 1405 list(attribute_list.get("handle_list", [])) 1406 1407 if use_std_handles: 1408 handle_list += [int(p2cread), int(c2pwrite), int(errwrite)] 1409 1410 handle_list[:] = self._filter_handle_list(handle_list) 1411 1412 if handle_list: 1413 if not close_fds: 1414 warnings.warn("startupinfo.lpAttributeList['handle_list'] " 1415 "overriding close_fds", RuntimeWarning) 1416 1417 # When using the handle_list we always request to inherit 1418 # handles but the only handles that will be inherited are 1419 # the ones in the handle_list 1420 close_fds = False 1421 1422 if shell: 1423 startupinfo.dwFlags |= _winapi.STARTF_USESHOWWINDOW 1424 startupinfo.wShowWindow = _winapi.SW_HIDE 1425 comspec = os.environ.get("COMSPEC", "cmd.exe") 1426 args = '{} /c "{}"'.format (comspec, args) 1427 1428 if cwd is not None: 1429 cwd = os.fsdecode(cwd) 1430 1431 sys.audit("subprocess.Popen", executable, args, cwd, env) 1432 1433 # Start the process 1434 try: 1435 hp, ht, pid, tid = _winapi.CreateProcess(executable, args, 1436 # no special security 1437 None, None, 1438 int(not close_fds), 1439 creationflags, 1440 env, 1441 cwd, 1442 startupinfo) 1443 finally: 1444 # Child is launched. Close the parent's copy of those pipe 1445 # handles that only the child should have open. You need 1446 # to make sure that no handles to the write end of the 1447 # output pipe are maintained in this process or else the 1448 # pipe will not close when the child process exits and the 1449 # ReadFile will hang. 1450 self._close_pipe_fds(p2cread, p2cwrite, 1451 c2pread, c2pwrite, 1452 errread, errwrite) 1453 1454 # Retain the process handle, but close the thread handle 1455 self._child_created = True 1456 self._handle = Handle(hp) 1457 self.pid = pid 1458 _winapi.CloseHandle(ht) 1459 1460 def _internal_poll(self, _deadstate=None, 1461 _WaitForSingleObject=_winapi.WaitForSingleObject, 1462 _WAIT_OBJECT_0=_winapi.WAIT_OBJECT_0, 1463 _GetExitCodeProcess=_winapi.GetExitCodeProcess): 1464 """Check if child process has terminated. Returns returncode 1465 attribute. 1466 1467 This method is called by __del__, so it can only refer to objects 1468 in its local scope. 1469 1470 """ 1471 if self.returncode is None: 1472 if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0: 1473 self.returncode = _GetExitCodeProcess(self._handle) 1474 return self.returncode 1475 1476 1477 def _wait(self, timeout): 1478 """Internal implementation of wait() on Windows.""" 1479 if timeout is None: 1480 timeout_millis = _winapi.INFINITE 1481 else: 1482 timeout_millis = int(timeout * 1000) 1483 if self.returncode is None: 1484 # API note: Returns immediately if timeout_millis == 0. 1485 result = _winapi.WaitForSingleObject(self._handle, 1486 timeout_millis) 1487 if result == _winapi.WAIT_TIMEOUT: 1488 raise TimeoutExpired(self.args, timeout) 1489 self.returncode = _winapi.GetExitCodeProcess(self._handle) 1490 return self.returncode 1491 1492 1493 def _readerthread(self, fh, buffer): 1494 buffer.append(fh.read()) 1495 fh.close() 1496 1497 1498 def _communicate(self, input, endtime, orig_timeout): 1499 # Start reader threads feeding into a list hanging off of this 1500 # object, unless they've already been started. 1501 if self.stdout and not hasattr(self, "_stdout_buff"): 1502 self._stdout_buff = [] 1503 self.stdout_thread = \ 1504 threading.Thread(target=self._readerthread, 1505 args=(self.stdout, self._stdout_buff)) 1506 self.stdout_thread.daemon = True 1507 self.stdout_thread.start() 1508 if self.stderr and not hasattr(self, "_stderr_buff"): 1509 self._stderr_buff = [] 1510 self.stderr_thread = \ 1511 threading.Thread(target=self._readerthread, 1512 args=(self.stderr, self._stderr_buff)) 1513 self.stderr_thread.daemon = True 1514 self.stderr_thread.start() 1515 1516 if self.stdin: 1517 self._stdin_write(input) 1518 1519 # Wait for the reader threads, or time out. If we time out, the 1520 # threads remain reading and the fds left open in case the user 1521 # calls communicate again. 1522 if self.stdout is not None: 1523 self.stdout_thread.join(self._remaining_time(endtime)) 1524 if self.stdout_thread.is_alive(): 1525 raise TimeoutExpired(self.args, orig_timeout) 1526 if self.stderr is not None: 1527 self.stderr_thread.join(self._remaining_time(endtime)) 1528 if self.stderr_thread.is_alive(): 1529 raise TimeoutExpired(self.args, orig_timeout) 1530 1531 # Collect the output from and close both pipes, now that we know 1532 # both have been read successfully. 1533 stdout = None 1534 stderr = None 1535 if self.stdout: 1536 stdout = self._stdout_buff 1537 self.stdout.close() 1538 if self.stderr: 1539 stderr = self._stderr_buff 1540 self.stderr.close() 1541 1542 # All data exchanged. Translate lists into strings. 1543 stdout = stdout[0] if stdout else None 1544 stderr = stderr[0] if stderr else None 1545 1546 return (stdout, stderr) 1547 1548 def send_signal(self, sig): 1549 """Send a signal to the process.""" 1550 # Don't signal a process that we know has already died. 1551 if self.returncode is not None: 1552 return 1553 if sig == signal.SIGTERM: 1554 self.terminate() 1555 elif sig == signal.CTRL_C_EVENT: 1556 os.kill(self.pid, signal.CTRL_C_EVENT) 1557 elif sig == signal.CTRL_BREAK_EVENT: 1558 os.kill(self.pid, signal.CTRL_BREAK_EVENT) 1559 else: 1560 raise ValueError("Unsupported signal: {}".format(sig)) 1561 1562 def terminate(self): 1563 """Terminates the process.""" 1564 # Don't terminate a process that we know has already died. 1565 if self.returncode is not None: 1566 return 1567 try: 1568 _winapi.TerminateProcess(self._handle, 1) 1569 except PermissionError: 1570 # ERROR_ACCESS_DENIED (winerror 5) is received when the 1571 # process already died. 1572 rc = _winapi.GetExitCodeProcess(self._handle) 1573 if rc == _winapi.STILL_ACTIVE: 1574 raise 1575 self.returncode = rc 1576 1577 kill = terminate 1578 1579 else: 1580 # 1581 # POSIX methods 1582 # 1583 def _get_handles(self, stdin, stdout, stderr): 1584 """Construct and return tuple with IO objects: 1585 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite 1586 """ 1587 p2cread, p2cwrite = -1, -1 1588 c2pread, c2pwrite = -1, -1 1589 errread, errwrite = -1, -1 1590 1591 if stdin is None: 1592 pass 1593 elif stdin == PIPE: 1594 p2cread, p2cwrite = os.pipe() 1595 if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"): 1596 fcntl.fcntl(p2cwrite, fcntl.F_SETPIPE_SZ, self.pipesize) 1597 elif stdin == DEVNULL: 1598 p2cread = self._get_devnull() 1599 elif isinstance(stdin, int): 1600 p2cread = stdin 1601 else: 1602 # Assuming file-like object 1603 p2cread = stdin.fileno() 1604 1605 if stdout is None: 1606 pass 1607 elif stdout == PIPE: 1608 c2pread, c2pwrite = os.pipe() 1609 if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"): 1610 fcntl.fcntl(c2pwrite, fcntl.F_SETPIPE_SZ, self.pipesize) 1611 elif stdout == DEVNULL: 1612 c2pwrite = self._get_devnull() 1613 elif isinstance(stdout, int): 1614 c2pwrite = stdout 1615 else: 1616 # Assuming file-like object 1617 c2pwrite = stdout.fileno() 1618 1619 if stderr is None: 1620 pass 1621 elif stderr == PIPE: 1622 errread, errwrite = os.pipe() 1623 if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"): 1624 fcntl.fcntl(errwrite, fcntl.F_SETPIPE_SZ, self.pipesize) 1625 elif stderr == STDOUT: 1626 if c2pwrite != -1: 1627 errwrite = c2pwrite 1628 else: # child's stdout is not set, use parent's stdout 1629 errwrite = sys.__stdout__.fileno() 1630 elif stderr == DEVNULL: 1631 errwrite = self._get_devnull() 1632 elif isinstance(stderr, int): 1633 errwrite = stderr 1634 else: 1635 # Assuming file-like object 1636 errwrite = stderr.fileno() 1637 1638 return (p2cread, p2cwrite, 1639 c2pread, c2pwrite, 1640 errread, errwrite) 1641 1642 1643 def _posix_spawn(self, args, executable, env, restore_signals, 1644 p2cread, p2cwrite, 1645 c2pread, c2pwrite, 1646 errread, errwrite): 1647 """Execute program using os.posix_spawn().""" 1648 if env is None: 1649 env = os.environ 1650 1651 kwargs = {} 1652 if restore_signals: 1653 # See _Py_RestoreSignals() in Python/pylifecycle.c 1654 sigset = [] 1655 for signame in ('SIGPIPE', 'SIGXFZ', 'SIGXFSZ'): 1656 signum = getattr(signal, signame, None) 1657 if signum is not None: 1658 sigset.append(signum) 1659 kwargs['setsigdef'] = sigset 1660 1661 file_actions = [] 1662 for fd in (p2cwrite, c2pread, errread): 1663 if fd != -1: 1664 file_actions.append((os.POSIX_SPAWN_CLOSE, fd)) 1665 for fd, fd2 in ( 1666 (p2cread, 0), 1667 (c2pwrite, 1), 1668 (errwrite, 2), 1669 ): 1670 if fd != -1: 1671 file_actions.append((os.POSIX_SPAWN_DUP2, fd, fd2)) 1672 if file_actions: 1673 kwargs['file_actions'] = file_actions 1674 1675 self.pid = os.posix_spawn(executable, args, env, **kwargs) 1676 self._child_created = True 1677 1678 self._close_pipe_fds(p2cread, p2cwrite, 1679 c2pread, c2pwrite, 1680 errread, errwrite) 1681 1682 def _execute_child(self, args, executable, preexec_fn, close_fds, 1683 pass_fds, cwd, env, 1684 startupinfo, creationflags, shell, 1685 p2cread, p2cwrite, 1686 c2pread, c2pwrite, 1687 errread, errwrite, 1688 restore_signals, 1689 gid, gids, uid, umask, 1690 start_new_session): 1691 """Execute program (POSIX version)""" 1692 1693 if isinstance(args, (str, bytes)): 1694 args = [args] 1695 elif isinstance(args, os.PathLike): 1696 if shell: 1697 raise TypeError('path-like args is not allowed when ' 1698 'shell is true') 1699 args = [args] 1700 else: 1701 args = list(args) 1702 1703 if shell: 1704 # On Android the default shell is at '/system/bin/sh'. 1705 unix_shell = ('/system/bin/sh' if 1706 hasattr(sys, 'getandroidapilevel') else '/bin/sh') 1707 args = [unix_shell, "-c"] + args 1708 if executable: 1709 args[0] = executable 1710 1711 if executable is None: 1712 executable = args[0] 1713 1714 sys.audit("subprocess.Popen", executable, args, cwd, env) 1715 1716 if (_USE_POSIX_SPAWN 1717 and os.path.dirname(executable) 1718 and preexec_fn is None 1719 and not close_fds 1720 and not pass_fds 1721 and cwd is None 1722 and (p2cread == -1 or p2cread > 2) 1723 and (c2pwrite == -1 or c2pwrite > 2) 1724 and (errwrite == -1 or errwrite > 2) 1725 and not start_new_session 1726 and gid is None 1727 and gids is None 1728 and uid is None 1729 and umask < 0): 1730 self._posix_spawn(args, executable, env, restore_signals, 1731 p2cread, p2cwrite, 1732 c2pread, c2pwrite, 1733 errread, errwrite) 1734 return 1735 1736 orig_executable = executable 1737 1738 # For transferring possible exec failure from child to parent. 1739 # Data format: "exception name:hex errno:description" 1740 # Pickle is not used; it is complex and involves memory allocation. 1741 errpipe_read, errpipe_write = os.pipe() 1742 # errpipe_write must not be in the standard io 0, 1, or 2 fd range. 1743 low_fds_to_close = [] 1744 while errpipe_write < 3: 1745 low_fds_to_close.append(errpipe_write) 1746 errpipe_write = os.dup(errpipe_write) 1747 for low_fd in low_fds_to_close: 1748 os.close(low_fd) 1749 try: 1750 try: 1751 # We must avoid complex work that could involve 1752 # malloc or free in the child process to avoid 1753 # potential deadlocks, thus we do all this here. 1754 # and pass it to fork_exec() 1755 1756 if env is not None: 1757 env_list = [] 1758 for k, v in env.items(): 1759 k = os.fsencode(k) 1760 if b'=' in k: 1761 raise ValueError("illegal environment variable name") 1762 env_list.append(k + b'=' + os.fsencode(v)) 1763 else: 1764 env_list = None # Use execv instead of execve. 1765 executable = os.fsencode(executable) 1766 if os.path.dirname(executable): 1767 executable_list = (executable,) 1768 else: 1769 # This matches the behavior of os._execvpe(). 1770 executable_list = tuple( 1771 os.path.join(os.fsencode(dir), executable) 1772 for dir in os.get_exec_path(env)) 1773 fds_to_keep = set(pass_fds) 1774 fds_to_keep.add(errpipe_write) 1775 self.pid = _posixsubprocess.fork_exec( 1776 args, executable_list, 1777 close_fds, tuple(sorted(map(int, fds_to_keep))), 1778 cwd, env_list, 1779 p2cread, p2cwrite, c2pread, c2pwrite, 1780 errread, errwrite, 1781 errpipe_read, errpipe_write, 1782 restore_signals, start_new_session, 1783 gid, gids, uid, umask, 1784 preexec_fn) 1785 self._child_created = True 1786 finally: 1787 # be sure the FD is closed no matter what 1788 os.close(errpipe_write) 1789 1790 self._close_pipe_fds(p2cread, p2cwrite, 1791 c2pread, c2pwrite, 1792 errread, errwrite) 1793 1794 # Wait for exec to fail or succeed; possibly raising an 1795 # exception (limited in size) 1796 errpipe_data = bytearray() 1797 while True: 1798 part = os.read(errpipe_read, 50000) 1799 errpipe_data += part 1800 if not part or len(errpipe_data) > 50000: 1801 break 1802 finally: 1803 # be sure the FD is closed no matter what 1804 os.close(errpipe_read) 1805 1806 if errpipe_data: 1807 try: 1808 pid, sts = os.waitpid(self.pid, 0) 1809 if pid == self.pid: 1810 self._handle_exitstatus(sts) 1811 else: 1812 self.returncode = sys.maxsize 1813 except ChildProcessError: 1814 pass 1815 1816 try: 1817 exception_name, hex_errno, err_msg = ( 1818 errpipe_data.split(b':', 2)) 1819 # The encoding here should match the encoding 1820 # written in by the subprocess implementations 1821 # like _posixsubprocess 1822 err_msg = err_msg.decode() 1823 except ValueError: 1824 exception_name = b'SubprocessError' 1825 hex_errno = b'0' 1826 err_msg = 'Bad exception data from child: {!r}'.format( 1827 bytes(errpipe_data)) 1828 child_exception_type = getattr( 1829 builtins, exception_name.decode('ascii'), 1830 SubprocessError) 1831 if issubclass(child_exception_type, OSError) and hex_errno: 1832 errno_num = int(hex_errno, 16) 1833 child_exec_never_called = (err_msg == "noexec") 1834 if child_exec_never_called: 1835 err_msg = "" 1836 # The error must be from chdir(cwd). 1837 err_filename = cwd 1838 else: 1839 err_filename = orig_executable 1840 if errno_num != 0: 1841 err_msg = os.strerror(errno_num) 1842 raise child_exception_type(errno_num, err_msg, err_filename) 1843 raise child_exception_type(err_msg) 1844 1845 1846 def _handle_exitstatus(self, sts, 1847 waitstatus_to_exitcode=os.waitstatus_to_exitcode, 1848 _WIFSTOPPED=os.WIFSTOPPED, 1849 _WSTOPSIG=os.WSTOPSIG): 1850 """All callers to this function MUST hold self._waitpid_lock.""" 1851 # This method is called (indirectly) by __del__, so it cannot 1852 # refer to anything outside of its local scope. 1853 if _WIFSTOPPED(sts): 1854 self.returncode = -_WSTOPSIG(sts) 1855 else: 1856 self.returncode = waitstatus_to_exitcode(sts) 1857 1858 def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid, 1859 _WNOHANG=os.WNOHANG, _ECHILD=errno.ECHILD): 1860 """Check if child process has terminated. Returns returncode 1861 attribute. 1862 1863 This method is called by __del__, so it cannot reference anything 1864 outside of the local scope (nor can any methods it calls). 1865 1866 """ 1867 if self.returncode is None: 1868 if not self._waitpid_lock.acquire(False): 1869 # Something else is busy calling waitpid. Don't allow two 1870 # at once. We know nothing yet. 1871 return None 1872 try: 1873 if self.returncode is not None: 1874 return self.returncode # Another thread waited. 1875 pid, sts = _waitpid(self.pid, _WNOHANG) 1876 if pid == self.pid: 1877 self._handle_exitstatus(sts) 1878 except OSError as e: 1879 if _deadstate is not None: 1880 self.returncode = _deadstate 1881 elif e.errno == _ECHILD: 1882 # This happens if SIGCLD is set to be ignored or 1883 # waiting for child processes has otherwise been 1884 # disabled for our process. This child is dead, we 1885 # can't get the status. 1886 # http://bugs.python.org/issue15756 1887 self.returncode = 0 1888 finally: 1889 self._waitpid_lock.release() 1890 return self.returncode 1891 1892 1893 def _try_wait(self, wait_flags): 1894 """All callers to this function MUST hold self._waitpid_lock.""" 1895 try: 1896 (pid, sts) = os.waitpid(self.pid, wait_flags) 1897 except ChildProcessError: 1898 # This happens if SIGCLD is set to be ignored or waiting 1899 # for child processes has otherwise been disabled for our 1900 # process. This child is dead, we can't get the status. 1901 pid = self.pid 1902 sts = 0 1903 return (pid, sts) 1904 1905 1906 def _wait(self, timeout): 1907 """Internal implementation of wait() on POSIX.""" 1908 if self.returncode is not None: 1909 return self.returncode 1910 1911 if timeout is not None: 1912 endtime = _time() + timeout 1913 # Enter a busy loop if we have a timeout. This busy loop was 1914 # cribbed from Lib/threading.py in Thread.wait() at r71065. 1915 delay = 0.0005 # 500 us -> initial delay of 1 ms 1916 while True: 1917 if self._waitpid_lock.acquire(False): 1918 try: 1919 if self.returncode is not None: 1920 break # Another thread waited. 1921 (pid, sts) = self._try_wait(os.WNOHANG) 1922 assert pid == self.pid or pid == 0 1923 if pid == self.pid: 1924 self._handle_exitstatus(sts) 1925 break 1926 finally: 1927 self._waitpid_lock.release() 1928 remaining = self._remaining_time(endtime) 1929 if remaining <= 0: 1930 raise TimeoutExpired(self.args, timeout) 1931 delay = min(delay * 2, remaining, .05) 1932 time.sleep(delay) 1933 else: 1934 while self.returncode is None: 1935 with self._waitpid_lock: 1936 if self.returncode is not None: 1937 break # Another thread waited. 1938 (pid, sts) = self._try_wait(0) 1939 # Check the pid and loop as waitpid has been known to 1940 # return 0 even without WNOHANG in odd situations. 1941 # http://bugs.python.org/issue14396. 1942 if pid == self.pid: 1943 self._handle_exitstatus(sts) 1944 return self.returncode 1945 1946 1947 def _communicate(self, input, endtime, orig_timeout): 1948 if self.stdin and not self._communication_started: 1949 # Flush stdio buffer. This might block, if the user has 1950 # been writing to .stdin in an uncontrolled fashion. 1951 try: 1952 self.stdin.flush() 1953 except BrokenPipeError: 1954 pass # communicate() must ignore BrokenPipeError. 1955 if not input: 1956 try: 1957 self.stdin.close() 1958 except BrokenPipeError: 1959 pass # communicate() must ignore BrokenPipeError. 1960 1961 stdout = None 1962 stderr = None 1963 1964 # Only create this mapping if we haven't already. 1965 if not self._communication_started: 1966 self._fileobj2output = {} 1967 if self.stdout: 1968 self._fileobj2output[self.stdout] = [] 1969 if self.stderr: 1970 self._fileobj2output[self.stderr] = [] 1971 1972 if self.stdout: 1973 stdout = self._fileobj2output[self.stdout] 1974 if self.stderr: 1975 stderr = self._fileobj2output[self.stderr] 1976 1977 self._save_input(input) 1978 1979 if self._input: 1980 input_view = memoryview(self._input) 1981 1982 with _PopenSelector() as selector: 1983 if self.stdin and input: 1984 selector.register(self.stdin, selectors.EVENT_WRITE) 1985 if self.stdout and not self.stdout.closed: 1986 selector.register(self.stdout, selectors.EVENT_READ) 1987 if self.stderr and not self.stderr.closed: 1988 selector.register(self.stderr, selectors.EVENT_READ) 1989 1990 while selector.get_map(): 1991 timeout = self._remaining_time(endtime) 1992 if timeout is not None and timeout < 0: 1993 self._check_timeout(endtime, orig_timeout, 1994 stdout, stderr, 1995 skip_check_and_raise=True) 1996 raise RuntimeError( # Impossible :) 1997 '_check_timeout(..., skip_check_and_raise=True) ' 1998 'failed to raise TimeoutExpired.') 1999 2000 ready = selector.select(timeout) 2001 self._check_timeout(endtime, orig_timeout, stdout, stderr) 2002 2003 # XXX Rewrite these to use non-blocking I/O on the file 2004 # objects; they are no longer using C stdio! 2005 2006 for key, events in ready: 2007 if key.fileobj is self.stdin: 2008 chunk = input_view[self._input_offset : 2009 self._input_offset + _PIPE_BUF] 2010 try: 2011 self._input_offset += os.write(key.fd, chunk) 2012 except BrokenPipeError: 2013 selector.unregister(key.fileobj) 2014 key.fileobj.close() 2015 else: 2016 if self._input_offset >= len(self._input): 2017 selector.unregister(key.fileobj) 2018 key.fileobj.close() 2019 elif key.fileobj in (self.stdout, self.stderr): 2020 data = os.read(key.fd, 32768) 2021 if not data: 2022 selector.unregister(key.fileobj) 2023 key.fileobj.close() 2024 self._fileobj2output[key.fileobj].append(data) 2025 2026 self.wait(timeout=self._remaining_time(endtime)) 2027 2028 # All data exchanged. Translate lists into strings. 2029 if stdout is not None: 2030 stdout = b''.join(stdout) 2031 if stderr is not None: 2032 stderr = b''.join(stderr) 2033 2034 # Translate newlines, if requested. 2035 # This also turns bytes into strings. 2036 if self.text_mode: 2037 if stdout is not None: 2038 stdout = self._translate_newlines(stdout, 2039 self.stdout.encoding, 2040 self.stdout.errors) 2041 if stderr is not None: 2042 stderr = self._translate_newlines(stderr, 2043 self.stderr.encoding, 2044 self.stderr.errors) 2045 2046 return (stdout, stderr) 2047 2048 2049 def _save_input(self, input): 2050 # This method is called from the _communicate_with_*() methods 2051 # so that if we time out while communicating, we can continue 2052 # sending input if we retry. 2053 if self.stdin and self._input is None: 2054 self._input_offset = 0 2055 self._input = input 2056 if input is not None and self.text_mode: 2057 self._input = self._input.encode(self.stdin.encoding, 2058 self.stdin.errors) 2059 2060 2061 def send_signal(self, sig): 2062 """Send a signal to the process.""" 2063 # bpo-38630: Polling reduces the risk of sending a signal to the 2064 # wrong process if the process completed, the Popen.returncode 2065 # attribute is still None, and the pid has been reassigned 2066 # (recycled) to a new different process. This race condition can 2067 # happens in two cases. 2068 # 2069 # Case 1. Thread A calls Popen.poll(), thread B calls 2070 # Popen.send_signal(). In thread A, waitpid() succeed and returns 2071 # the exit status. Thread B calls kill() because poll() in thread A 2072 # did not set returncode yet. Calling poll() in thread B prevents 2073 # the race condition thanks to Popen._waitpid_lock. 2074 # 2075 # Case 2. waitpid(pid, 0) has been called directly, without 2076 # using Popen methods: returncode is still None is this case. 2077 # Calling Popen.poll() will set returncode to a default value, 2078 # since waitpid() fails with ProcessLookupError. 2079 self.poll() 2080 if self.returncode is not None: 2081 # Skip signalling a process that we know has already died. 2082 return 2083 2084 # The race condition can still happen if the race condition 2085 # described above happens between the returncode test 2086 # and the kill() call. 2087 try: 2088 os.kill(self.pid, sig) 2089 except ProcessLookupError: 2090 # Supress the race condition error; bpo-40550. 2091 pass 2092 2093 def terminate(self): 2094 """Terminate the process with SIGTERM 2095 """ 2096 self.send_signal(signal.SIGTERM) 2097 2098 def kill(self): 2099 """Kill the process with SIGKILL 2100 """ 2101 self.send_signal(signal.SIGKILL) 2102