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