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