python模块:subprocess
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 10 r"""Subprocesses with accessible I/O streams 11 12 This module allows you to spawn processes, connect to their 13 input/output/error pipes, and obtain their return codes. 14 15 For a complete description of this module see the Python documentation. 16 17 Main API 18 ======== 19 run(...): Runs a command, waits for it to complete, then returns a 20 CompletedProcess instance. 21 Popen(...): A class for flexibly executing a command in a new process 22 23 Constants 24 --------- 25 DEVNULL: Special value that indicates that os.devnull should be used 26 PIPE: Special value that indicates a pipe should be created 27 STDOUT: Special value that indicates that stderr should go to stdout 28 29 30 Older API 31 ========= 32 call(...): Runs a command, waits for it to complete, then returns 33 the return code. 34 check_call(...): Same as call() but raises CalledProcessError() 35 if return code is not 0 36 check_output(...): Same as check_call() but returns the contents of 37 stdout instead of a return code 38 getoutput(...): Runs a command in the shell, waits for it to complete, 39 then returns the output 40 getstatusoutput(...): Runs a command in the shell, waits for it to complete, 41 then returns a (exitcode, output) tuple 42 """ 43 44 import sys 45 _mswindows = (sys.platform == "win32") 46 47 import io 48 import os 49 import time 50 import signal 51 import builtins 52 import warnings 53 import errno 54 from time import monotonic as _time 55 56 # Exception classes used by this module. 57 class SubprocessError(Exception): pass 58 59 60 class CalledProcessError(SubprocessError): 61 """Raised when run() is called with check=True and the process 62 returns a non-zero exit status. 63 64 Attributes: 65 cmd, returncode, stdout, stderr, output 66 """ 67 def __init__(self, returncode, cmd, output=None, stderr=None): 68 self.returncode = returncode 69 self.cmd = cmd 70 self.output = output 71 self.stderr = stderr 72 73 def __str__(self): 74 if self.returncode and self.returncode < 0: 75 try: 76 return "Command '%s' died with %r." % ( 77 self.cmd, signal.Signals(-self.returncode)) 78 except ValueError: 79 return "Command '%s' died with unknown signal %d." % ( 80 self.cmd, -self.returncode) 81 else: 82 return "Command '%s' returned non-zero exit status %d." % ( 83 self.cmd, self.returncode) 84 85 @property 86 def stdout(self): 87 """Alias for output attribute, to match stderr""" 88 return self.output 89 90 @stdout.setter 91 def stdout(self, value): 92 # There's no obvious reason to set this, but allow it anyway so 93 # .stdout is a transparent alias for .output 94 self.output = value 95 96 97 class TimeoutExpired(SubprocessError): 98 """This exception is raised when the timeout expires while waiting for a 99 child process. 100 101 Attributes: 102 cmd, output, stdout, stderr, timeout 103 """ 104 def __init__(self, cmd, timeout, output=None, stderr=None): 105 self.cmd = cmd 106 self.timeout = timeout 107 self.output = output 108 self.stderr = stderr 109 110 def __str__(self): 111 return ("Command '%s' timed out after %s seconds" % 112 (self.cmd, self.timeout)) 113 114 @property 115 def stdout(self): 116 return self.output 117 118 @stdout.setter 119 def stdout(self, value): 120 # There's no obvious reason to set this, but allow it anyway so 121 # .stdout is a transparent alias for .output 122 self.output = value 123 124 125 if _mswindows: 126 import threading 127 import msvcrt 128 import _winapi 129 class STARTUPINFO: 130 dwFlags = 0 131 hStdInput = None 132 hStdOutput = None 133 hStdError = None 134 wShowWindow = 0 135 else: 136 import _posixsubprocess 137 import select 138 import selectors 139 try: 140 import threading 141 except ImportError: 142 import dummy_threading as threading 143 144 # When select or poll has indicated that the file is writable, 145 # we can write up to _PIPE_BUF bytes without risk of blocking. 146 # POSIX defines PIPE_BUF as >= 512. 147 _PIPE_BUF = getattr(select, 'PIPE_BUF', 512) 148 149 # poll/select have the advantage of not requiring any extra file 150 # descriptor, contrarily to epoll/kqueue (also, they require a single 151 # syscall). 152 if hasattr(selectors, 'PollSelector'): 153 _PopenSelector = selectors.PollSelector 154 else: 155 _PopenSelector = selectors.SelectSelector 156 157 158 __all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "getstatusoutput", 159 "getoutput", "check_output", "run", "CalledProcessError", "DEVNULL", 160 "SubprocessError", "TimeoutExpired", "CompletedProcess"] 161 # NOTE: We intentionally exclude list2cmdline as it is 162 # considered an internal implementation detail. issue10838. 163 164 if _mswindows: 165 from _winapi import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP, 166 STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, 167 STD_ERROR_HANDLE, SW_HIDE, 168 STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW) 169 170 __all__.extend(["CREATE_NEW_CONSOLE", "CREATE_NEW_PROCESS_GROUP", 171 "STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE", 172 "STD_ERROR_HANDLE", "SW_HIDE", 173 "STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW", 174 "STARTUPINFO"]) 175 176 class Handle(int): 177 closed = False 178 179 def Close(self, CloseHandle=_winapi.CloseHandle): 180 if not self.closed: 181 self.closed = True 182 CloseHandle(self) 183 184 def Detach(self): 185 if not self.closed: 186 self.closed = True 187 return int(self) 188 raise ValueError("already closed") 189 190 def __repr__(self): 191 return "%s(%d)" % (self.__class__.__name__, int(self)) 192 193 __del__ = Close 194 __str__ = __repr__ 195 196 197 # This lists holds Popen instances for which the underlying process had not 198 # exited at the time its __del__ method got called: those processes are wait()ed 199 # for synchronously from _cleanup() when a new Popen object is created, to avoid 200 # zombie processes. 201 _active = [] 202 203 def _cleanup(): 204 for inst in _active[:]: 205 res = inst._internal_poll(_deadstate=sys.maxsize) 206 if res is not None: 207 try: 208 _active.remove(inst) 209 except ValueError: 210 # This can happen if two threads create a new Popen instance. 211 # It's harmless that it was already removed, so ignore. 212 pass 213 214 PIPE = -1 215 STDOUT = -2 216 DEVNULL = -3 217 218 219 # XXX This function is only used by multiprocessing and the test suite, 220 # but it's here so that it can be imported when Python is compiled without 221 # threads. 222 223 def _optim_args_from_interpreter_flags(): 224 """Return a list of command-line arguments reproducing the current 225 optimization settings in sys.flags.""" 226 args = [] 227 value = sys.flags.optimize 228 if value > 0: 229 args.append('-' + 'O' * value) 230 return args 231 232 233 def _args_from_interpreter_flags(): 234 """Return a list of command-line arguments reproducing the current 235 settings in sys.flags and sys.warnoptions.""" 236 flag_opt_map = { 237 'debug': 'd', 238 # 'inspect': 'i', 239 # 'interactive': 'i', 240 'dont_write_bytecode': 'B', 241 'no_user_site': 's', 242 'no_site': 'S', 243 'ignore_environment': 'E', 244 'verbose': 'v', 245 'bytes_warning': 'b', 246 'quiet': 'q', 247 # -O is handled in _optim_args_from_interpreter_flags() 248 } 249 args = _optim_args_from_interpreter_flags() 250 for flag, opt in flag_opt_map.items(): 251 v = getattr(sys.flags, flag) 252 if v > 0: 253 args.append('-' + opt * v) 254 for opt in sys.warnoptions: 255 args.append('-W' + opt) 256 return args 257 258 259 def call(*popenargs, timeout=None, **kwargs): 260 """Run command with arguments. Wait for command to complete or 261 timeout, then return the returncode attribute. 262 263 The arguments are the same as for the Popen constructor. Example: 264 265 retcode = call(["ls", "-l"]) 266 """ 267 with Popen(*popenargs, **kwargs) as p: 268 try: 269 return p.wait(timeout=timeout) 270 except: 271 p.kill() 272 p.wait() 273 raise 274 275 276 def check_call(*popenargs, **kwargs): 277 """Run command with arguments. Wait for command to complete. If 278 the exit code was zero then return, otherwise raise 279 CalledProcessError. The CalledProcessError object will have the 280 return code in the returncode attribute. 281 282 The arguments are the same as for the call function. Example: 283 284 check_call(["ls", "-l"]) 285 """ 286 retcode = call(*popenargs, **kwargs) 287 if retcode: 288 cmd = kwargs.get("args") 289 if cmd is None: 290 cmd = popenargs[0] 291 raise CalledProcessError(retcode, cmd) 292 return 0 293 294 295 def check_output(*popenargs, timeout=None, **kwargs): 296 r"""Run command with arguments and return its output. 297 298 If the exit code was non-zero it raises a CalledProcessError. The 299 CalledProcessError object will have the return code in the returncode 300 attribute and output in the output attribute. 301 302 The arguments are the same as for the Popen constructor. Example: 303 304 >>> check_output(["ls", "-l", "/dev/null"]) 305 b'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n' 306 307 The stdout argument is not allowed as it is used internally. 308 To capture standard error in the result, use stderr=STDOUT. 309 310 >>> check_output(["/bin/sh", "-c", 311 ... "ls -l non_existent_file ; exit 0"], 312 ... stderr=STDOUT) 313 b'ls: non_existent_file: No such file or directory\n' 314 315 There is an additional optional argument, "input", allowing you to 316 pass a string to the subprocess's stdin. If you use this argument 317 you may not also use the Popen constructor's "stdin" argument, as 318 it too will be used internally. Example: 319 320 >>> check_output(["sed", "-e", "s/foo/bar/"], 321 ... input=b"when in the course of fooman events\n") 322 b'when in the course of barman events\n' 323 324 If universal_newlines=True is passed, the "input" argument must be a 325 string and the return value will be a string rather than bytes. 326 """ 327 if 'stdout' in kwargs: 328 raise ValueError('stdout argument not allowed, it will be overridden.') 329 330 if 'input' in kwargs and kwargs['input'] is None: 331 # Explicitly passing input=None was previously equivalent to passing an 332 # empty string. That is maintained here for backwards compatibility. 333 kwargs['input'] = '' if kwargs.get('universal_newlines', False) else b'' 334 335 return run(*popenargs, stdout=PIPE, timeout=timeout, check=True, 336 **kwargs).stdout 337 338 339 class CompletedProcess(object): 340 """A process that has finished running. 341 342 This is returned by run(). 343 344 Attributes: 345 args: The list or str args passed to run(). 346 returncode: The exit code of the process, negative for signals. 347 stdout: The standard output (None if not captured). 348 stderr: The standard error (None if not captured). 349 """ 350 def __init__(self, args, returncode, stdout=None, stderr=None): 351 self.args = args 352 self.returncode = returncode 353 self.stdout = stdout 354 self.stderr = stderr 355 356 def __repr__(self): 357 args = ['args={!r}'.format(self.args), 358 'returncode={!r}'.format(self.returncode)] 359 if self.stdout is not None: 360 args.append('stdout={!r}'.format(self.stdout)) 361 if self.stderr is not None: 362 args.append('stderr={!r}'.format(self.stderr)) 363 return "{}({})".format(type(self).__name__, ', '.join(args)) 364 365 def check_returncode(self): 366 """Raise CalledProcessError if the exit code is non-zero.""" 367 if self.returncode: 368 raise CalledProcessError(self.returncode, self.args, self.stdout, 369 self.stderr) 370 371 372 def run(*popenargs, input=None, timeout=None, check=False, **kwargs): 373 """Run command with arguments and return a CompletedProcess instance. 374 375 The returned instance will have attributes args, returncode, stdout and 376 stderr. By default, stdout and stderr are not captured, and those attributes 377 will be None. Pass stdout=PIPE and/or stderr=PIPE in order to capture them. 378 379 If check is True and the exit code was non-zero, it raises a 380 CalledProcessError. The CalledProcessError object will have the return code 381 in the returncode attribute, and output & stderr attributes if those streams 382 were captured. 383 384 If timeout is given, and the process takes too long, a TimeoutExpired 385 exception will be raised. 386 387 There is an optional argument "input", allowing you to 388 pass a string to the subprocess's stdin. If you use this argument 389 you may not also use the Popen constructor's "stdin" argument, as 390 it will be used internally. 391 392 The other arguments are the same as for the Popen constructor. 393 394 If universal_newlines=True is passed, the "input" argument must be a 395 string and stdout/stderr in the returned object will be strings rather than 396 bytes. 397 """ 398 if input is not None: 399 if 'stdin' in kwargs: 400 raise ValueError('stdin and input arguments may not both be used.') 401 kwargs['stdin'] = PIPE 402 403 with Popen(*popenargs, **kwargs) as process: 404 try: 405 stdout, stderr = process.communicate(input, timeout=timeout) 406 except TimeoutExpired: 407 process.kill() 408 stdout, stderr = process.communicate() 409 raise TimeoutExpired(process.args, timeout, output=stdout, 410 stderr=stderr) 411 except: 412 process.kill() 413 process.wait() 414 raise 415 retcode = process.poll() 416 if check and retcode: 417 raise CalledProcessError(retcode, process.args, 418 output=stdout, stderr=stderr) 419 return CompletedProcess(process.args, retcode, stdout, stderr) 420 421 422 def list2cmdline(seq): 423 """ 424 Translate a sequence of arguments into a command line 425 string, using the same rules as the MS C runtime: 426 427 1) Arguments are delimited by white space, which is either a 428 space or a tab. 429 430 2) A string surrounded by double quotation marks is 431 interpreted as a single argument, regardless of white space 432 contained within. A quoted string can be embedded in an 433 argument. 434 435 3) A double quotation mark preceded by a backslash is 436 interpreted as a literal double quotation mark. 437 438 4) Backslashes are interpreted literally, unless they 439 immediately precede a double quotation mark. 440 441 5) If backslashes immediately precede a double quotation mark, 442 every pair of backslashes is interpreted as a literal 443 backslash. If the number of backslashes is odd, the last 444 backslash escapes the next double quotation mark as 445 described in rule 3. 446 """ 447 448 # See 449 # http://msdn.microsoft.com/en-us/library/17w5ykft.aspx 450 # or search http://msdn.microsoft.com for 451 # "Parsing C++ Command-Line Arguments" 452 result = [] 453 needquote = False 454 for arg in seq: 455 bs_buf = [] 456 457 # Add a space to separate this argument from the others 458 if result: 459 result.append(' ') 460 461 needquote = (" " in arg) or ("\t" in arg) or not arg 462 if needquote: 463 result.append('"') 464 465 for c in arg: 466 if c == '\\': 467 # Don't know if we need to double yet. 468 bs_buf.append(c) 469 elif c == '"': 470 # Double backslashes. 471 result.append('\\' * len(bs_buf)*2) 472 bs_buf = [] 473 result.append('\\"') 474 else: 475 # Normal char 476 if bs_buf: 477 result.extend(bs_buf) 478 bs_buf = [] 479 result.append(c) 480 481 # Add remaining backslashes, if any. 482 if bs_buf: 483 result.extend(bs_buf) 484 485 if needquote: 486 result.extend(bs_buf) 487 result.append('"') 488 489 return ''.join(result) 490 491 492 # Various tools for executing commands and looking at their output and status. 493 # 494 495 def getstatusoutput(cmd): 496 """Return (exitcode, output) of executing cmd in a shell. 497 498 Execute the string 'cmd' in a shell with 'check_output' and 499 return a 2-tuple (status, output). The locale encoding is used 500 to decode the output and process newlines. 501 502 A trailing newline is stripped from the output. 503 The exit status for the command can be interpreted 504 according to the rules for the function 'wait'. Example: 505 506 >>> import subprocess 507 >>> subprocess.getstatusoutput('ls /bin/ls') 508 (0, '/bin/ls') 509 >>> subprocess.getstatusoutput('cat /bin/junk') 510 (1, 'cat: /bin/junk: No such file or directory') 511 >>> subprocess.getstatusoutput('/bin/junk') 512 (127, 'sh: /bin/junk: not found') 513 >>> subprocess.getstatusoutput('/bin/kill $$') 514 (-15, '') 515 """ 516 try: 517 data = check_output(cmd, shell=True, universal_newlines=True, stderr=STDOUT) 518 exitcode = 0 519 except CalledProcessError as ex: 520 data = ex.output 521 exitcode = ex.returncode 522 if data[-1:] == '\n': 523 data = data[:-1] 524 return exitcode, data 525 526 def getoutput(cmd): 527 """Return output (stdout or stderr) of executing cmd in a shell. 528 529 Like getstatusoutput(), except the exit status is ignored and the return 530 value is a string containing the command's output. Example: 531 532 >>> import subprocess 533 >>> subprocess.getoutput('ls /bin/ls') 534 '/bin/ls' 535 """ 536 return getstatusoutput(cmd)[1] 537 538 539 _PLATFORM_DEFAULT_CLOSE_FDS = object() 540 541 542 class Popen(object): 543 """ Execute a child program in a new process. 544 545 For a complete description of the arguments see the Python documentation. 546 547 Arguments: 548 args: A string, or a sequence of program arguments. 549 550 bufsize: supplied as the buffering argument to the open() function when 551 creating the stdin/stdout/stderr pipe file objects 552 553 executable: A replacement program to execute. 554 555 stdin, stdout and stderr: These specify the executed programs' standard 556 input, standard output and standard error file handles, respectively. 557 558 preexec_fn: (POSIX only) An object to be called in the child process 559 just before the child is executed. 560 561 close_fds: Controls closing or inheriting of file descriptors. 562 563 shell: If true, the command will be executed through the shell. 564 565 cwd: Sets the current directory before the child is executed. 566 567 env: Defines the environment variables for the new process. 568 569 universal_newlines: If true, use universal line endings for file 570 objects stdin, stdout and stderr. 571 572 startupinfo and creationflags (Windows only) 573 574 restore_signals (POSIX only) 575 576 start_new_session (POSIX only) 577 578 pass_fds (POSIX only) 579 580 encoding and errors: Text mode encoding and error handling to use for 581 file objects stdin, stdout and stderr. 582 583 Attributes: 584 stdin, stdout, stderr, pid, returncode 585 """ 586 _child_created = False # Set here since __del__ checks it 587 588 def __init__(self, args, bufsize=-1, executable=None, 589 stdin=None, stdout=None, stderr=None, 590 preexec_fn=None, close_fds=_PLATFORM_DEFAULT_CLOSE_FDS, 591 shell=False, cwd=None, env=None, universal_newlines=False, 592 startupinfo=None, creationflags=0, 593 restore_signals=True, start_new_session=False, 594 pass_fds=(), *, encoding=None, errors=None): 595 """Create new Popen instance.""" 596 _cleanup() 597 # Held while anything is calling waitpid before returncode has been 598 # updated to prevent clobbering returncode if wait() or poll() are 599 # called from multiple threads at once. After acquiring the lock, 600 # code must re-check self.returncode to see if another thread just 601 # finished a waitpid() call. 602 self._waitpid_lock = threading.Lock() 603 604 self._input = None 605 self._communication_started = False 606 if bufsize is None: 607 bufsize = -1 # Restore default 608 if not isinstance(bufsize, int): 609 raise TypeError("bufsize must be an integer") 610 611 if _mswindows: 612 if preexec_fn is not None: 613 raise ValueError("preexec_fn is not supported on Windows " 614 "platforms") 615 any_stdio_set = (stdin is not None or stdout is not None or 616 stderr is not None) 617 if close_fds is _PLATFORM_DEFAULT_CLOSE_FDS: 618 if any_stdio_set: 619 close_fds = False 620 else: 621 close_fds = True 622 elif close_fds and any_stdio_set: 623 raise ValueError( 624 "close_fds is not supported on Windows platforms" 625 " if you redirect stdin/stdout/stderr") 626 else: 627 # POSIX 628 if close_fds is _PLATFORM_DEFAULT_CLOSE_FDS: 629 close_fds = True 630 if pass_fds and not close_fds: 631 warnings.warn("pass_fds overriding close_fds.", RuntimeWarning) 632 close_fds = True 633 if startupinfo is not None: 634 raise ValueError("startupinfo is only supported on Windows " 635 "platforms") 636 if creationflags != 0: 637 raise ValueError("creationflags is only supported on Windows " 638 "platforms") 639 640 self.args = args 641 self.stdin = None 642 self.stdout = None 643 self.stderr = None 644 self.pid = None 645 self.returncode = None 646 self.universal_newlines = universal_newlines 647 self.encoding = encoding 648 self.errors = errors 649 650 # Input and output objects. The general principle is like 651 # this: 652 # 653 # Parent Child 654 # ------ ----- 655 # p2cwrite ---stdin---> p2cread 656 # c2pread <--stdout--- c2pwrite 657 # errread <--stderr--- errwrite 658 # 659 # On POSIX, the child objects are file descriptors. On 660 # Windows, these are Windows file handles. The parent objects 661 # are file descriptors on both platforms. The parent objects 662 # are -1 when not using PIPEs. The child objects are -1 663 # when not redirecting. 664 665 (p2cread, p2cwrite, 666 c2pread, c2pwrite, 667 errread, errwrite) = self._get_handles(stdin, stdout, stderr) 668 669 # We wrap OS handles *before* launching the child, otherwise a 670 # quickly terminating child could make our fds unwrappable 671 # (see #8458). 672 673 if _mswindows: 674 if p2cwrite != -1: 675 p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0) 676 if c2pread != -1: 677 c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0) 678 if errread != -1: 679 errread = msvcrt.open_osfhandle(errread.Detach(), 0) 680 681 text_mode = encoding or errors or universal_newlines 682 683 self._closed_child_pipe_fds = False 684 685 try: 686 if p2cwrite != -1: 687 self.stdin = io.open(p2cwrite, 'wb', bufsize) 688 if text_mode: 689 self.stdin = io.TextIOWrapper(self.stdin, write_through=True, 690 line_buffering=(bufsize == 1), 691 encoding=encoding, errors=errors) 692 if c2pread != -1: 693 self.stdout = io.open(c2pread, 'rb', bufsize) 694 if text_mode: 695 self.stdout = io.TextIOWrapper(self.stdout, 696 encoding=encoding, errors=errors) 697 if errread != -1: 698 self.stderr = io.open(errread, 'rb', bufsize) 699 if text_mode: 700 self.stderr = io.TextIOWrapper(self.stderr, 701 encoding=encoding, errors=errors) 702 703 self._execute_child(args, executable, preexec_fn, close_fds, 704 pass_fds, cwd, env, 705 startupinfo, creationflags, shell, 706 p2cread, p2cwrite, 707 c2pread, c2pwrite, 708 errread, errwrite, 709 restore_signals, start_new_session) 710 except: 711 # Cleanup if the child failed starting. 712 for f in filter(None, (self.stdin, self.stdout, self.stderr)): 713 try: 714 f.close() 715 except OSError: 716 pass # Ignore EBADF or other errors. 717 718 if not self._closed_child_pipe_fds: 719 to_close = [] 720 if stdin == PIPE: 721 to_close.append(p2cread) 722 if stdout == PIPE: 723 to_close.append(c2pwrite) 724 if stderr == PIPE: 725 to_close.append(errwrite) 726 if hasattr(self, '_devnull'): 727 to_close.append(self._devnull) 728 for fd in to_close: 729 try: 730 if _mswindows and isinstance(fd, Handle): 731 fd.Close() 732 else: 733 os.close(fd) 734 except OSError: 735 pass 736 737 raise 738 739 def _translate_newlines(self, data, encoding, errors): 740 data = data.decode(encoding, errors) 741 return data.replace("\r\n", "\n").replace("\r", "\n") 742 743 def __enter__(self): 744 return self 745 746 def __exit__(self, type, value, traceback): 747 if self.stdout: 748 self.stdout.close() 749 if self.stderr: 750 self.stderr.close() 751 try: # Flushing a BufferedWriter may raise an error 752 if self.stdin: 753 self.stdin.close() 754 finally: 755 # Wait for the process to terminate, to avoid zombies. 756 self.wait() 757 758 def __del__(self, _maxsize=sys.maxsize, _warn=warnings.warn): 759 if not self._child_created: 760 # We didn't get to successfully create a child process. 761 return 762 if self.returncode is None: 763 # Not reading subprocess exit status creates a zombi process which 764 # is only destroyed at the parent python process exit 765 _warn("subprocess %s is still running" % self.pid, 766 ResourceWarning, source=self) 767 # In case the child hasn't been waited on, check if it's done. 768 self._internal_poll(_deadstate=_maxsize) 769 if self.returncode is None and _active is not None: 770 # Child is still running, keep us alive until we can wait on it. 771 _active.append(self) 772 773 def _get_devnull(self): 774 if not hasattr(self, '_devnull'): 775 self._devnull = os.open(os.devnull, os.O_RDWR) 776 return self._devnull 777 778 def _stdin_write(self, input): 779 if input: 780 try: 781 self.stdin.write(input) 782 except BrokenPipeError: 783 pass # communicate() must ignore broken pipe errors. 784 except OSError as exc: 785 if exc.errno == errno.EINVAL: 786 # bpo-19612, bpo-30418: On Windows, stdin.write() fails 787 # with EINVAL if the child process exited or if the child 788 # process is still running but closed the pipe. 789 pass 790 else: 791 raise 792 793 try: 794 self.stdin.close() 795 except BrokenPipeError: 796 pass # communicate() must ignore broken pipe errors. 797 except OSError as exc: 798 if exc.errno == errno.EINVAL: 799 pass 800 else: 801 raise 802 803 def communicate(self, input=None, timeout=None): 804 """Interact with process: Send data to stdin. Read data from 805 stdout and stderr, until end-of-file is reached. Wait for 806 process to terminate. 807 808 The optional "input" argument should be data to be sent to the 809 child process (if self.universal_newlines is True, this should 810 be a string; if it is False, "input" should be bytes), or 811 None, if no data should be sent to the child. 812 813 communicate() returns a tuple (stdout, stderr). These will be 814 bytes or, if self.universal_newlines was True, a string. 815 """ 816 817 if self._communication_started and input: 818 raise ValueError("Cannot send input after starting communication") 819 820 # Optimization: If we are not worried about timeouts, we haven't 821 # started communicating, and we have one or zero pipes, using select() 822 # or threads is unnecessary. 823 if (timeout is None and not self._communication_started and 824 [self.stdin, self.stdout, self.stderr].count(None) >= 2): 825 stdout = None 826 stderr = None 827 if self.stdin: 828 self._stdin_write(input) 829 elif self.stdout: 830 stdout = self.stdout.read() 831 self.stdout.close() 832 elif self.stderr: 833 stderr = self.stderr.read() 834 self.stderr.close() 835 self.wait() 836 else: 837 if timeout is not None: 838 endtime = _time() + timeout 839 else: 840 endtime = None 841 842 try: 843 stdout, stderr = self._communicate(input, endtime, timeout) 844 finally: 845 self._communication_started = True 846 847 sts = self.wait(timeout=self._remaining_time(endtime)) 848 849 return (stdout, stderr) 850 851 852 def poll(self): 853 """Check if child process has terminated. Set and return returncode 854 attribute.""" 855 return self._internal_poll() 856 857 858 def _remaining_time(self, endtime): 859 """Convenience for _communicate when computing timeouts.""" 860 if endtime is None: 861 return None 862 else: 863 return endtime - _time() 864 865 866 def _check_timeout(self, endtime, orig_timeout): 867 """Convenience for checking if a timeout has expired.""" 868 if endtime is None: 869 return 870 if _time() > endtime: 871 raise TimeoutExpired(self.args, orig_timeout) 872 873 874 if _mswindows: 875 # 876 # Windows methods 877 # 878 def _get_handles(self, stdin, stdout, stderr): 879 """Construct and return tuple with IO objects: 880 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite 881 """ 882 if stdin is None and stdout is None and stderr is None: 883 return (-1, -1, -1, -1, -1, -1) 884 885 p2cread, p2cwrite = -1, -1 886 c2pread, c2pwrite = -1, -1 887 errread, errwrite = -1, -1 888 889 if stdin is None: 890 p2cread = _winapi.GetStdHandle(_winapi.STD_INPUT_HANDLE) 891 if p2cread is None: 892 p2cread, _ = _winapi.CreatePipe(None, 0) 893 p2cread = Handle(p2cread) 894 _winapi.CloseHandle(_) 895 elif stdin == PIPE: 896 p2cread, p2cwrite = _winapi.CreatePipe(None, 0) 897 p2cread, p2cwrite = Handle(p2cread), Handle(p2cwrite) 898 elif stdin == DEVNULL: 899 p2cread = msvcrt.get_osfhandle(self._get_devnull()) 900 elif isinstance(stdin, int): 901 p2cread = msvcrt.get_osfhandle(stdin) 902 else: 903 # Assuming file-like object 904 p2cread = msvcrt.get_osfhandle(stdin.fileno()) 905 p2cread = self._make_inheritable(p2cread) 906 907 if stdout is None: 908 c2pwrite = _winapi.GetStdHandle(_winapi.STD_OUTPUT_HANDLE) 909 if c2pwrite is None: 910 _, c2pwrite = _winapi.CreatePipe(None, 0) 911 c2pwrite = Handle(c2pwrite) 912 _winapi.CloseHandle(_) 913 elif stdout == PIPE: 914 c2pread, c2pwrite = _winapi.CreatePipe(None, 0) 915 c2pread, c2pwrite = Handle(c2pread), Handle(c2pwrite) 916 elif stdout == DEVNULL: 917 c2pwrite = msvcrt.get_osfhandle(self._get_devnull()) 918 elif isinstance(stdout, int): 919 c2pwrite = msvcrt.get_osfhandle(stdout) 920 else: 921 # Assuming file-like object 922 c2pwrite = msvcrt.get_osfhandle(stdout.fileno()) 923 c2pwrite = self._make_inheritable(c2pwrite) 924 925 if stderr is None: 926 errwrite = _winapi.GetStdHandle(_winapi.STD_ERROR_HANDLE) 927 if errwrite is None: 928 _, errwrite = _winapi.CreatePipe(None, 0) 929 errwrite = Handle(errwrite) 930 _winapi.CloseHandle(_) 931 elif stderr == PIPE: 932 errread, errwrite = _winapi.CreatePipe(None, 0) 933 errread, errwrite = Handle(errread), Handle(errwrite) 934 elif stderr == STDOUT: 935 errwrite = c2pwrite 936 elif stderr == DEVNULL: 937 errwrite = msvcrt.get_osfhandle(self._get_devnull()) 938 elif isinstance(stderr, int): 939 errwrite = msvcrt.get_osfhandle(stderr) 940 else: 941 # Assuming file-like object 942 errwrite = msvcrt.get_osfhandle(stderr.fileno()) 943 errwrite = self._make_inheritable(errwrite) 944 945 return (p2cread, p2cwrite, 946 c2pread, c2pwrite, 947 errread, errwrite) 948 949 950 def _make_inheritable(self, handle): 951 """Return a duplicate of handle, which is inheritable""" 952 h = _winapi.DuplicateHandle( 953 _winapi.GetCurrentProcess(), handle, 954 _winapi.GetCurrentProcess(), 0, 1, 955 _winapi.DUPLICATE_SAME_ACCESS) 956 return Handle(h) 957 958 959 def _execute_child(self, args, executable, preexec_fn, close_fds, 960 pass_fds, cwd, env, 961 startupinfo, creationflags, shell, 962 p2cread, p2cwrite, 963 c2pread, c2pwrite, 964 errread, errwrite, 965 unused_restore_signals, unused_start_new_session): 966 """Execute program (MS Windows version)""" 967 968 assert not pass_fds, "pass_fds not supported on Windows." 969 970 if not isinstance(args, str): 971 args = list2cmdline(args) 972 973 # Process startup details 974 if startupinfo is None: 975 startupinfo = STARTUPINFO() 976 if -1 not in (p2cread, c2pwrite, errwrite): 977 startupinfo.dwFlags |= _winapi.STARTF_USESTDHANDLES 978 startupinfo.hStdInput = p2cread 979 startupinfo.hStdOutput = c2pwrite 980 startupinfo.hStdError = errwrite 981 982 if shell: 983 startupinfo.dwFlags |= _winapi.STARTF_USESHOWWINDOW 984 startupinfo.wShowWindow = _winapi.SW_HIDE 985 comspec = os.environ.get("COMSPEC", "cmd.exe") 986 args = '{} /c "{}"'.format (comspec, args) 987 988 # Start the process 989 try: 990 hp, ht, pid, tid = _winapi.CreateProcess(executable, args, 991 # no special security 992 None, None, 993 int(not close_fds), 994 creationflags, 995 env, 996 os.fspath(cwd) if cwd is not None else None, 997 startupinfo) 998 finally: 999 # Child is launched. Close the parent's copy of those pipe 1000 # handles that only the child should have open. You need 1001 # to make sure that no handles to the write end of the 1002 # output pipe are maintained in this process or else the 1003 # pipe will not close when the child process exits and the 1004 # ReadFile will hang. 1005 if p2cread != -1: 1006 p2cread.Close() 1007 if c2pwrite != -1: 1008 c2pwrite.Close() 1009 if errwrite != -1: 1010 errwrite.Close() 1011 if hasattr(self, '_devnull'): 1012 os.close(self._devnull) 1013 # Prevent a double close of these handles/fds from __init__ 1014 # on error. 1015 self._closed_child_pipe_fds = True 1016 1017 # Retain the process handle, but close the thread handle 1018 self._child_created = True 1019 self._handle = Handle(hp) 1020 self.pid = pid 1021 _winapi.CloseHandle(ht) 1022 1023 def _internal_poll(self, _deadstate=None, 1024 _WaitForSingleObject=_winapi.WaitForSingleObject, 1025 _WAIT_OBJECT_0=_winapi.WAIT_OBJECT_0, 1026 _GetExitCodeProcess=_winapi.GetExitCodeProcess): 1027 """Check if child process has terminated. Returns returncode 1028 attribute. 1029 1030 This method is called by __del__, so it can only refer to objects 1031 in its local scope. 1032 1033 """ 1034 if self.returncode is None: 1035 if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0: 1036 self.returncode = _GetExitCodeProcess(self._handle) 1037 return self.returncode 1038 1039 1040 def wait(self, timeout=None, endtime=None): 1041 """Wait for child process to terminate. Returns returncode 1042 attribute.""" 1043 if endtime is not None: 1044 warnings.warn( 1045 "'endtime' argument is deprecated; use 'timeout'.", 1046 DeprecationWarning, 1047 stacklevel=2) 1048 timeout = self._remaining_time(endtime) 1049 if timeout is None: 1050 timeout_millis = _winapi.INFINITE 1051 else: 1052 timeout_millis = int(timeout * 1000) 1053 if self.returncode is None: 1054 result = _winapi.WaitForSingleObject(self._handle, 1055 timeout_millis) 1056 if result == _winapi.WAIT_TIMEOUT: 1057 raise TimeoutExpired(self.args, timeout) 1058 self.returncode = _winapi.GetExitCodeProcess(self._handle) 1059 return self.returncode 1060 1061 1062 def _readerthread(self, fh, buffer): 1063 buffer.append(fh.read()) 1064 fh.close() 1065 1066 1067 def _communicate(self, input, endtime, orig_timeout): 1068 # Start reader threads feeding into a list hanging off of this 1069 # object, unless they've already been started. 1070 if self.stdout and not hasattr(self, "_stdout_buff"): 1071 self._stdout_buff = [] 1072 self.stdout_thread = \ 1073 threading.Thread(target=self._readerthread, 1074 args=(self.stdout, self._stdout_buff)) 1075 self.stdout_thread.daemon = True 1076 self.stdout_thread.start() 1077 if self.stderr and not hasattr(self, "_stderr_buff"): 1078 self._stderr_buff = [] 1079 self.stderr_thread = \ 1080 threading.Thread(target=self._readerthread, 1081 args=(self.stderr, self._stderr_buff)) 1082 self.stderr_thread.daemon = True 1083 self.stderr_thread.start() 1084 1085 if self.stdin: 1086 self._stdin_write(input) 1087 1088 # Wait for the reader threads, or time out. If we time out, the 1089 # threads remain reading and the fds left open in case the user 1090 # calls communicate again. 1091 if self.stdout is not None: 1092 self.stdout_thread.join(self._remaining_time(endtime)) 1093 if self.stdout_thread.is_alive(): 1094 raise TimeoutExpired(self.args, orig_timeout) 1095 if self.stderr is not None: 1096 self.stderr_thread.join(self._remaining_time(endtime)) 1097 if self.stderr_thread.is_alive(): 1098 raise TimeoutExpired(self.args, orig_timeout) 1099 1100 # Collect the output from and close both pipes, now that we know 1101 # both have been read successfully. 1102 stdout = None 1103 stderr = None 1104 if self.stdout: 1105 stdout = self._stdout_buff 1106 self.stdout.close() 1107 if self.stderr: 1108 stderr = self._stderr_buff 1109 self.stderr.close() 1110 1111 # All data exchanged. Translate lists into strings. 1112 if stdout is not None: 1113 stdout = stdout[0] 1114 if stderr is not None: 1115 stderr = stderr[0] 1116 1117 return (stdout, stderr) 1118 1119 def send_signal(self, sig): 1120 """Send a signal to the process.""" 1121 # Don't signal a process that we know has already died. 1122 if self.returncode is not None: 1123 return 1124 if sig == signal.SIGTERM: 1125 self.terminate() 1126 elif sig == signal.CTRL_C_EVENT: 1127 os.kill(self.pid, signal.CTRL_C_EVENT) 1128 elif sig == signal.CTRL_BREAK_EVENT: 1129 os.kill(self.pid, signal.CTRL_BREAK_EVENT) 1130 else: 1131 raise ValueError("Unsupported signal: {}".format(sig)) 1132 1133 def terminate(self): 1134 """Terminates the process.""" 1135 # Don't terminate a process that we know has already died. 1136 if self.returncode is not None: 1137 return 1138 try: 1139 _winapi.TerminateProcess(self._handle, 1) 1140 except PermissionError: 1141 # ERROR_ACCESS_DENIED (winerror 5) is received when the 1142 # process already died. 1143 rc = _winapi.GetExitCodeProcess(self._handle) 1144 if rc == _winapi.STILL_ACTIVE: 1145 raise 1146 self.returncode = rc 1147 1148 kill = terminate 1149 1150 else: 1151 # 1152 # POSIX methods 1153 # 1154 def _get_handles(self, stdin, stdout, stderr): 1155 """Construct and return tuple with IO objects: 1156 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite 1157 """ 1158 p2cread, p2cwrite = -1, -1 1159 c2pread, c2pwrite = -1, -1 1160 errread, errwrite = -1, -1 1161 1162 if stdin is None: 1163 pass 1164 elif stdin == PIPE: 1165 p2cread, p2cwrite = os.pipe() 1166 elif stdin == DEVNULL: 1167 p2cread = self._get_devnull() 1168 elif isinstance(stdin, int): 1169 p2cread = stdin 1170 else: 1171 # Assuming file-like object 1172 p2cread = stdin.fileno() 1173 1174 if stdout is None: 1175 pass 1176 elif stdout == PIPE: 1177 c2pread, c2pwrite = os.pipe() 1178 elif stdout == DEVNULL: 1179 c2pwrite = self._get_devnull() 1180 elif isinstance(stdout, int): 1181 c2pwrite = stdout 1182 else: 1183 # Assuming file-like object 1184 c2pwrite = stdout.fileno() 1185 1186 if stderr is None: 1187 pass 1188 elif stderr == PIPE: 1189 errread, errwrite = os.pipe() 1190 elif stderr == STDOUT: 1191 if c2pwrite != -1: 1192 errwrite = c2pwrite 1193 else: # child's stdout is not set, use parent's stdout 1194 errwrite = sys.__stdout__.fileno() 1195 elif stderr == DEVNULL: 1196 errwrite = self._get_devnull() 1197 elif isinstance(stderr, int): 1198 errwrite = stderr 1199 else: 1200 # Assuming file-like object 1201 errwrite = stderr.fileno() 1202 1203 return (p2cread, p2cwrite, 1204 c2pread, c2pwrite, 1205 errread, errwrite) 1206 1207 1208 def _execute_child(self, args, executable, preexec_fn, close_fds, 1209 pass_fds, cwd, env, 1210 startupinfo, creationflags, shell, 1211 p2cread, p2cwrite, 1212 c2pread, c2pwrite, 1213 errread, errwrite, 1214 restore_signals, start_new_session): 1215 """Execute program (POSIX version)""" 1216 1217 if isinstance(args, (str, bytes)): 1218 args = [args] 1219 else: 1220 args = list(args) 1221 1222 if shell: 1223 args = ["/bin/sh", "-c"] + args 1224 if executable: 1225 args[0] = executable 1226 1227 if executable is None: 1228 executable = args[0] 1229 orig_executable = executable 1230 1231 # For transferring possible exec failure from child to parent. 1232 # Data format: "exception name:hex errno:description" 1233 # Pickle is not used; it is complex and involves memory allocation. 1234 errpipe_read, errpipe_write = os.pipe() 1235 # errpipe_write must not be in the standard io 0, 1, or 2 fd range. 1236 low_fds_to_close = [] 1237 while errpipe_write < 3: 1238 low_fds_to_close.append(errpipe_write) 1239 errpipe_write = os.dup(errpipe_write) 1240 for low_fd in low_fds_to_close: 1241 os.close(low_fd) 1242 try: 1243 try: 1244 # We must avoid complex work that could involve 1245 # malloc or free in the child process to avoid 1246 # potential deadlocks, thus we do all this here. 1247 # and pass it to fork_exec() 1248 1249 if env is not None: 1250 env_list = [] 1251 for k, v in env.items(): 1252 k = os.fsencode(k) 1253 if b'=' in k: 1254 raise ValueError("illegal environment variable name") 1255 env_list.append(k + b'=' + os.fsencode(v)) 1256 else: 1257 env_list = None # Use execv instead of execve. 1258 executable = os.fsencode(executable) 1259 if os.path.dirname(executable): 1260 executable_list = (executable,) 1261 else: 1262 # This matches the behavior of os._execvpe(). 1263 executable_list = tuple( 1264 os.path.join(os.fsencode(dir), executable) 1265 for dir in os.get_exec_path(env)) 1266 fds_to_keep = set(pass_fds) 1267 fds_to_keep.add(errpipe_write) 1268 self.pid = _posixsubprocess.fork_exec( 1269 args, executable_list, 1270 close_fds, tuple(sorted(map(int, fds_to_keep))), 1271 cwd, env_list, 1272 p2cread, p2cwrite, c2pread, c2pwrite, 1273 errread, errwrite, 1274 errpipe_read, errpipe_write, 1275 restore_signals, start_new_session, preexec_fn) 1276 self._child_created = True 1277 finally: 1278 # be sure the FD is closed no matter what 1279 os.close(errpipe_write) 1280 1281 # self._devnull is not always defined. 1282 devnull_fd = getattr(self, '_devnull', None) 1283 if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd: 1284 os.close(p2cread) 1285 if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd: 1286 os.close(c2pwrite) 1287 if errwrite != -1 and errread != -1 and errwrite != devnull_fd: 1288 os.close(errwrite) 1289 if devnull_fd is not None: 1290 os.close(devnull_fd) 1291 # Prevent a double close of these fds from __init__ on error. 1292 self._closed_child_pipe_fds = True 1293 1294 # Wait for exec to fail or succeed; possibly raising an 1295 # exception (limited in size) 1296 errpipe_data = bytearray() 1297 while True: 1298 part = os.read(errpipe_read, 50000) 1299 errpipe_data += part 1300 if not part or len(errpipe_data) > 50000: 1301 break 1302 finally: 1303 # be sure the FD is closed no matter what 1304 os.close(errpipe_read) 1305 1306 if errpipe_data: 1307 try: 1308 pid, sts = os.waitpid(self.pid, 0) 1309 if pid == self.pid: 1310 self._handle_exitstatus(sts) 1311 else: 1312 self.returncode = sys.maxsize 1313 except ChildProcessError: 1314 pass 1315 1316 try: 1317 exception_name, hex_errno, err_msg = ( 1318 errpipe_data.split(b':', 2)) 1319 # The encoding here should match the encoding 1320 # written in by the subprocess implementations 1321 # like _posixsubprocess 1322 err_msg = err_msg.decode() 1323 except ValueError: 1324 exception_name = b'SubprocessError' 1325 hex_errno = b'0' 1326 err_msg = 'Bad exception data from child: {!r}'.format( 1327 bytes(errpipe_data)) 1328 child_exception_type = getattr( 1329 builtins, exception_name.decode('ascii'), 1330 SubprocessError) 1331 if issubclass(child_exception_type, OSError) and hex_errno: 1332 errno_num = int(hex_errno, 16) 1333 child_exec_never_called = (err_msg == "noexec") 1334 if child_exec_never_called: 1335 err_msg = "" 1336 # The error must be from chdir(cwd). 1337 err_filename = cwd 1338 else: 1339 err_filename = orig_executable 1340 if errno_num != 0: 1341 err_msg = os.strerror(errno_num) 1342 if errno_num == errno.ENOENT: 1343 err_msg += ': ' + repr(err_filename) 1344 raise child_exception_type(errno_num, err_msg, err_filename) 1345 raise child_exception_type(err_msg) 1346 1347 1348 def _handle_exitstatus(self, sts, _WIFSIGNALED=os.WIFSIGNALED, 1349 _WTERMSIG=os.WTERMSIG, _WIFEXITED=os.WIFEXITED, 1350 _WEXITSTATUS=os.WEXITSTATUS, _WIFSTOPPED=os.WIFSTOPPED, 1351 _WSTOPSIG=os.WSTOPSIG): 1352 """All callers to this function MUST hold self._waitpid_lock.""" 1353 # This method is called (indirectly) by __del__, so it cannot 1354 # refer to anything outside of its local scope. 1355 if _WIFSIGNALED(sts): 1356 self.returncode = -_WTERMSIG(sts) 1357 elif _WIFEXITED(sts): 1358 self.returncode = _WEXITSTATUS(sts) 1359 elif _WIFSTOPPED(sts): 1360 self.returncode = -_WSTOPSIG(sts) 1361 else: 1362 # Should never happen 1363 raise SubprocessError("Unknown child exit status!") 1364 1365 1366 def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid, 1367 _WNOHANG=os.WNOHANG, _ECHILD=errno.ECHILD): 1368 """Check if child process has terminated. Returns returncode 1369 attribute. 1370 1371 This method is called by __del__, so it cannot reference anything 1372 outside of the local scope (nor can any methods it calls). 1373 1374 """ 1375 if self.returncode is None: 1376 if not self._waitpid_lock.acquire(False): 1377 # Something else is busy calling waitpid. Don't allow two 1378 # at once. We know nothing yet. 1379 return None 1380 try: 1381 if self.returncode is not None: 1382 return self.returncode # Another thread waited. 1383 pid, sts = _waitpid(self.pid, _WNOHANG) 1384 if pid == self.pid: 1385 self._handle_exitstatus(sts) 1386 except OSError as e: 1387 if _deadstate is not None: 1388 self.returncode = _deadstate 1389 elif e.errno == _ECHILD: 1390 # This happens if SIGCLD is set to be ignored or 1391 # waiting for child processes has otherwise been 1392 # disabled for our process. This child is dead, we 1393 # can't get the status. 1394 # http://bugs.python.org/issue15756 1395 self.returncode = 0 1396 finally: 1397 self._waitpid_lock.release() 1398 return self.returncode 1399 1400 1401 def _try_wait(self, wait_flags): 1402 """All callers to this function MUST hold self._waitpid_lock.""" 1403 try: 1404 (pid, sts) = os.waitpid(self.pid, wait_flags) 1405 except ChildProcessError: 1406 # This happens if SIGCLD is set to be ignored or waiting 1407 # for child processes has otherwise been disabled for our 1408 # process. This child is dead, we can't get the status. 1409 pid = self.pid 1410 sts = 0 1411 return (pid, sts) 1412 1413 1414 def wait(self, timeout=None, endtime=None): 1415 """Wait for child process to terminate. Returns returncode 1416 attribute.""" 1417 if self.returncode is not None: 1418 return self.returncode 1419 1420 if endtime is not None: 1421 warnings.warn( 1422 "'endtime' argument is deprecated; use 'timeout'.", 1423 DeprecationWarning, 1424 stacklevel=2) 1425 if endtime is not None or timeout is not None: 1426 if endtime is None: 1427 endtime = _time() + timeout 1428 elif timeout is None: 1429 timeout = self._remaining_time(endtime) 1430 1431 if endtime is not None: 1432 # Enter a busy loop if we have a timeout. This busy loop was 1433 # cribbed from Lib/threading.py in Thread.wait() at r71065. 1434 delay = 0.0005 # 500 us -> initial delay of 1 ms 1435 while True: 1436 if self._waitpid_lock.acquire(False): 1437 try: 1438 if self.returncode is not None: 1439 break # Another thread waited. 1440 (pid, sts) = self._try_wait(os.WNOHANG) 1441 assert pid == self.pid or pid == 0 1442 if pid == self.pid: 1443 self._handle_exitstatus(sts) 1444 break 1445 finally: 1446 self._waitpid_lock.release() 1447 remaining = self._remaining_time(endtime) 1448 if remaining <= 0: 1449 raise TimeoutExpired(self.args, timeout) 1450 delay = min(delay * 2, remaining, .05) 1451 time.sleep(delay) 1452 else: 1453 while self.returncode is None: 1454 with self._waitpid_lock: 1455 if self.returncode is not None: 1456 break # Another thread waited. 1457 (pid, sts) = self._try_wait(0) 1458 # Check the pid and loop as waitpid has been known to 1459 # return 0 even without WNOHANG in odd situations. 1460 # http://bugs.python.org/issue14396. 1461 if pid == self.pid: 1462 self._handle_exitstatus(sts) 1463 return self.returncode 1464 1465 1466 def _communicate(self, input, endtime, orig_timeout): 1467 if self.stdin and not self._communication_started: 1468 # Flush stdio buffer. This might block, if the user has 1469 # been writing to .stdin in an uncontrolled fashion. 1470 try: 1471 self.stdin.flush() 1472 except BrokenPipeError: 1473 pass # communicate() must ignore BrokenPipeError. 1474 if not input: 1475 try: 1476 self.stdin.close() 1477 except BrokenPipeError: 1478 pass # communicate() must ignore BrokenPipeError. 1479 1480 stdout = None 1481 stderr = None 1482 1483 # Only create this mapping if we haven't already. 1484 if not self._communication_started: 1485 self._fileobj2output = {} 1486 if self.stdout: 1487 self._fileobj2output[self.stdout] = [] 1488 if self.stderr: 1489 self._fileobj2output[self.stderr] = [] 1490 1491 if self.stdout: 1492 stdout = self._fileobj2output[self.stdout] 1493 if self.stderr: 1494 stderr = self._fileobj2output[self.stderr] 1495 1496 self._save_input(input) 1497 1498 if self._input: 1499 input_view = memoryview(self._input) 1500 1501 with _PopenSelector() as selector: 1502 if self.stdin and input: 1503 selector.register(self.stdin, selectors.EVENT_WRITE) 1504 if self.stdout: 1505 selector.register(self.stdout, selectors.EVENT_READ) 1506 if self.stderr: 1507 selector.register(self.stderr, selectors.EVENT_READ) 1508 1509 while selector.get_map(): 1510 timeout = self._remaining_time(endtime) 1511 if timeout is not None and timeout < 0: 1512 raise TimeoutExpired(self.args, orig_timeout) 1513 1514 ready = selector.select(timeout) 1515 self._check_timeout(endtime, orig_timeout) 1516 1517 # XXX Rewrite these to use non-blocking I/O on the file 1518 # objects; they are no longer using C stdio! 1519 1520 for key, events in ready: 1521 if key.fileobj is self.stdin: 1522 chunk = input_view[self._input_offset : 1523 self._input_offset + _PIPE_BUF] 1524 try: 1525 self._input_offset += os.write(key.fd, chunk) 1526 except BrokenPipeError: 1527 selector.unregister(key.fileobj) 1528 key.fileobj.close() 1529 else: 1530 if self._input_offset >= len(self._input): 1531 selector.unregister(key.fileobj) 1532 key.fileobj.close() 1533 elif key.fileobj in (self.stdout, self.stderr): 1534 data = os.read(key.fd, 32768) 1535 if not data: 1536 selector.unregister(key.fileobj) 1537 key.fileobj.close() 1538 self._fileobj2output[key.fileobj].append(data) 1539 1540 self.wait(timeout=self._remaining_time(endtime)) 1541 1542 # All data exchanged. Translate lists into strings. 1543 if stdout is not None: 1544 stdout = b''.join(stdout) 1545 if stderr is not None: 1546 stderr = b''.join(stderr) 1547 1548 # Translate newlines, if requested. 1549 # This also turns bytes into strings. 1550 if self.encoding or self.errors or self.universal_newlines: 1551 if stdout is not None: 1552 stdout = self._translate_newlines(stdout, 1553 self.stdout.encoding, 1554 self.stdout.errors) 1555 if stderr is not None: 1556 stderr = self._translate_newlines(stderr, 1557 self.stderr.encoding, 1558 self.stderr.errors) 1559 1560 return (stdout, stderr) 1561 1562 1563 def _save_input(self, input): 1564 # This method is called from the _communicate_with_*() methods 1565 # so that if we time out while communicating, we can continue 1566 # sending input if we retry. 1567 if self.stdin and self._input is None: 1568 self._input_offset = 0 1569 self._input = input 1570 if input is not None and ( 1571 self.encoding or self.errors or self.universal_newlines): 1572 self._input = self._input.encode(self.stdin.encoding, 1573 self.stdin.errors) 1574 1575 1576 def send_signal(self, sig): 1577 """Send a signal to the process.""" 1578 # Skip signalling a process that we know has already died. 1579 if self.returncode is None: 1580 os.kill(self.pid, sig) 1581 1582 def terminate(self): 1583 """Terminate the process with SIGTERM 1584 """ 1585 self.send_signal(signal.SIGTERM) 1586 1587 def kill(self): 1588 """Kill the process with SIGKILL 1589 """ 1590 self.send_signal(signal.SIGKILL)
每天更新一点点,温习一点点点,进步一点点