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