Home | History | Annotate | Download | only in python2.7
      1 # subprocess - Subprocesses with accessible I/O streams
      2 #
      3 # For more information about this module, see PEP 324.
      4 #
      5 # This module should remain compatible with Python 2.2, see PEP 291.
      6 #
      7 # Copyright (c) 2003-2005 by Peter Astrand <astrand (at] lysator.liu.se>
      8 #
      9 # Licensed to PSF under a Contributor Agreement.
     10 # See http://www.python.org/2.4/license for licensing details.
     11 
     12 r"""subprocess - Subprocesses with accessible I/O streams
     13 
     14 This module allows you to spawn processes, connect to their
     15 input/output/error pipes, and obtain their return codes.  This module
     16 intends to replace several other, older modules and functions, like:
     17 
     18 os.system
     19 os.spawn*
     20 os.popen*
     21 popen2.*
     22 commands.*
     23 
     24 Information about how the subprocess module can be used to replace these
     25 modules and functions can be found below.
     26 
     27 
     28 
     29 Using the subprocess module
     30 ===========================
     31 This module defines one class called Popen:
     32 
     33 class Popen(args, bufsize=0, executable=None,
     34             stdin=None, stdout=None, stderr=None,
     35             preexec_fn=None, close_fds=False, shell=False,
     36             cwd=None, env=None, universal_newlines=False,
     37             startupinfo=None, creationflags=0):
     38 
     39 
     40 Arguments are:
     41 
     42 args should be a string, or a sequence of program arguments.  The
     43 program to execute is normally the first item in the args sequence or
     44 string, but can be explicitly set by using the executable argument.
     45 
     46 On UNIX, with shell=False (default): In this case, the Popen class
     47 uses os.execvp() to execute the child program.  args should normally
     48 be a sequence.  A string will be treated as a sequence with the string
     49 as the only item (the program to execute).
     50 
     51 On UNIX, with shell=True: If args is a string, it specifies the
     52 command string to execute through the shell.  If args is a sequence,
     53 the first item specifies the command string, and any additional items
     54 will be treated as additional shell arguments.
     55 
     56 On Windows: the Popen class uses CreateProcess() to execute the child
     57 program, which operates on strings.  If args is a sequence, it will be
     58 converted to a string using the list2cmdline method.  Please note that
     59 not all MS Windows applications interpret the command line the same
     60 way: The list2cmdline is designed for applications using the same
     61 rules as the MS C runtime.
     62 
     63 bufsize, if given, has the same meaning as the corresponding argument
     64 to the built-in open() function: 0 means unbuffered, 1 means line
     65 buffered, any other positive value means use a buffer of
     66 (approximately) that size.  A negative bufsize means to use the system
     67 default, which usually means fully buffered.  The default value for
     68 bufsize is 0 (unbuffered).
     69 
     70 stdin, stdout and stderr specify the executed programs' standard
     71 input, standard output and standard error file handles, respectively.
     72 Valid values are PIPE, an existing file descriptor (a positive
     73 integer), an existing file object, and None.  PIPE indicates that a
     74 new pipe to the child should be created.  With None, no redirection
     75 will occur; the child's file handles will be inherited from the
     76 parent.  Additionally, stderr can be STDOUT, which indicates that the
     77 stderr data from the applications should be captured into the same
     78 file handle as for stdout.
     79 
     80 If preexec_fn is set to a callable object, this object will be called
     81 in the child process just before the child is executed.
     82 
     83 If close_fds is true, all file descriptors except 0, 1 and 2 will be
     84 closed before the child process is executed.
     85 
     86 if shell is true, the specified command will be executed through the
     87 shell.
     88 
     89 If cwd is not None, the current directory will be changed to cwd
     90 before the child is executed.
     91 
     92 If env is not None, it defines the environment variables for the new
     93 process.
     94 
     95 If universal_newlines is true, the file objects stdout and stderr are
     96 opened as a text files, but lines may be terminated by any of '\n',
     97 the Unix end-of-line convention, '\r', the Macintosh convention or
     98 '\r\n', the Windows convention.  All of these external representations
     99 are seen as '\n' by the Python program.  Note: This feature is only
    100 available if Python is built with universal newline support (the
    101 default).  Also, the newlines attribute of the file objects stdout,
    102 stdin and stderr are not updated by the communicate() method.
    103 
    104 The startupinfo and creationflags, if given, will be passed to the
    105 underlying CreateProcess() function.  They can specify things such as
    106 appearance of the main window and priority for the new process.
    107 (Windows only)
    108 
    109 
    110 This module also defines some shortcut functions:
    111 
    112 call(*popenargs, **kwargs):
    113     Run command with arguments.  Wait for command to complete, then
    114     return the returncode attribute.
    115 
    116     The arguments are the same as for the Popen constructor.  Example:
    117 
    118     retcode = call(["ls", "-l"])
    119 
    120 check_call(*popenargs, **kwargs):
    121     Run command with arguments.  Wait for command to complete.  If the
    122     exit code was zero then return, otherwise raise
    123     CalledProcessError.  The CalledProcessError object will have the
    124     return code in the returncode attribute.
    125 
    126     The arguments are the same as for the Popen constructor.  Example:
    127 
    128     check_call(["ls", "-l"])
    129 
    130 check_output(*popenargs, **kwargs):
    131     Run command with arguments and return its output as a byte string.
    132 
    133     If the exit code was non-zero it raises a CalledProcessError.  The
    134     CalledProcessError object will have the return code in the returncode
    135     attribute and output in the output attribute.
    136 
    137     The arguments are the same as for the Popen constructor.  Example:
    138 
    139     output = check_output(["ls", "-l", "/dev/null"])
    140 
    141 
    142 Exceptions
    143 ----------
    144 Exceptions raised in the child process, before the new program has
    145 started to execute, will be re-raised in the parent.  Additionally,
    146 the exception object will have one extra attribute called
    147 'child_traceback', which is a string containing traceback information
    148 from the childs point of view.
    149 
    150 The most common exception raised is OSError.  This occurs, for
    151 example, when trying to execute a non-existent file.  Applications
    152 should prepare for OSErrors.
    153 
    154 A ValueError will be raised if Popen is called with invalid arguments.
    155 
    156 check_call() and check_output() will raise CalledProcessError, if the
    157 called process returns a non-zero return code.
    158 
    159 
    160 Security
    161 --------
    162 Unlike some other popen functions, this implementation will never call
    163 /bin/sh implicitly.  This means that all characters, including shell
    164 metacharacters, can safely be passed to child processes.
    165 
    166 
    167 Popen objects
    168 =============
    169 Instances of the Popen class have the following methods:
    170 
    171 poll()
    172     Check if child process has terminated.  Returns returncode
    173     attribute.
    174 
    175 wait()
    176     Wait for child process to terminate.  Returns returncode attribute.
    177 
    178 communicate(input=None)
    179     Interact with process: Send data to stdin.  Read data from stdout
    180     and stderr, until end-of-file is reached.  Wait for process to
    181     terminate.  The optional input argument should be a string to be
    182     sent to the child process, or None, if no data should be sent to
    183     the child.
    184 
    185     communicate() returns a tuple (stdout, stderr).
    186 
    187     Note: The data read is buffered in memory, so do not use this
    188     method if the data size is large or unlimited.
    189 
    190 The following attributes are also available:
    191 
    192 stdin
    193     If the stdin argument is PIPE, this attribute is a file object
    194     that provides input to the child process.  Otherwise, it is None.
    195 
    196 stdout
    197     If the stdout argument is PIPE, this attribute is a file object
    198     that provides output from the child process.  Otherwise, it is
    199     None.
    200 
    201 stderr
    202     If the stderr argument is PIPE, this attribute is file object that
    203     provides error output from the child process.  Otherwise, it is
    204     None.
    205 
    206 pid
    207     The process ID of the child process.
    208 
    209 returncode
    210     The child return code.  A None value indicates that the process
    211     hasn't terminated yet.  A negative value -N indicates that the
    212     child was terminated by signal N (UNIX only).
    213 
    214 
    215 Replacing older functions with the subprocess module
    216 ====================================================
    217 In this section, "a ==> b" means that b can be used as a replacement
    218 for a.
    219 
    220 Note: All functions in this section fail (more or less) silently if
    221 the executed program cannot be found; this module raises an OSError
    222 exception.
    223 
    224 In the following examples, we assume that the subprocess module is
    225 imported with "from subprocess import *".
    226 
    227 
    228 Replacing /bin/sh shell backquote
    229 ---------------------------------
    230 output=`mycmd myarg`
    231 ==>
    232 output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]
    233 
    234 
    235 Replacing shell pipe line
    236 -------------------------
    237 output=`dmesg | grep hda`
    238 ==>
    239 p1 = Popen(["dmesg"], stdout=PIPE)
    240 p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
    241 output = p2.communicate()[0]
    242 
    243 
    244 Replacing os.system()
    245 ---------------------
    246 sts = os.system("mycmd" + " myarg")
    247 ==>
    248 p = Popen("mycmd" + " myarg", shell=True)
    249 pid, sts = os.waitpid(p.pid, 0)
    250 
    251 Note:
    252 
    253 * Calling the program through the shell is usually not required.
    254 
    255 * It's easier to look at the returncode attribute than the
    256   exitstatus.
    257 
    258 A more real-world example would look like this:
    259 
    260 try:
    261     retcode = call("mycmd" + " myarg", shell=True)
    262     if retcode < 0:
    263         print >>sys.stderr, "Child was terminated by signal", -retcode
    264     else:
    265         print >>sys.stderr, "Child returned", retcode
    266 except OSError, e:
    267     print >>sys.stderr, "Execution failed:", e
    268 
    269 
    270 Replacing os.spawn*
    271 -------------------
    272 P_NOWAIT example:
    273 
    274 pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")
    275 ==>
    276 pid = Popen(["/bin/mycmd", "myarg"]).pid
    277 
    278 
    279 P_WAIT example:
    280 
    281 retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")
    282 ==>
    283 retcode = call(["/bin/mycmd", "myarg"])
    284 
    285 
    286 Vector example:
    287 
    288 os.spawnvp(os.P_NOWAIT, path, args)
    289 ==>
    290 Popen([path] + args[1:])
    291 
    292 
    293 Environment example:
    294 
    295 os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
    296 ==>
    297 Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})
    298 
    299 
    300 Replacing os.popen*
    301 -------------------
    302 pipe = os.popen("cmd", mode='r', bufsize)
    303 ==>
    304 pipe = Popen("cmd", shell=True, bufsize=bufsize, stdout=PIPE).stdout
    305 
    306 pipe = os.popen("cmd", mode='w', bufsize)
    307 ==>
    308 pipe = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE).stdin
    309 
    310 
    311 (child_stdin, child_stdout) = os.popen2("cmd", mode, bufsize)
    312 ==>
    313 p = Popen("cmd", shell=True, bufsize=bufsize,
    314           stdin=PIPE, stdout=PIPE, close_fds=True)
    315 (child_stdin, child_stdout) = (p.stdin, p.stdout)
    316 
    317 
    318 (child_stdin,
    319  child_stdout,
    320  child_stderr) = os.popen3("cmd", mode, bufsize)
    321 ==>
    322 p = Popen("cmd", shell=True, bufsize=bufsize,
    323           stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
    324 (child_stdin,
    325  child_stdout,
    326  child_stderr) = (p.stdin, p.stdout, p.stderr)
    327 
    328 
    329 (child_stdin, child_stdout_and_stderr) = os.popen4("cmd", mode,
    330                                                    bufsize)
    331 ==>
    332 p = Popen("cmd", shell=True, bufsize=bufsize,
    333           stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
    334 (child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout)
    335 
    336 On Unix, os.popen2, os.popen3 and os.popen4 also accept a sequence as
    337 the command to execute, in which case arguments will be passed
    338 directly to the program without shell intervention.  This usage can be
    339 replaced as follows:
    340 
    341 (child_stdin, child_stdout) = os.popen2(["/bin/ls", "-l"], mode,
    342                                         bufsize)
    343 ==>
    344 p = Popen(["/bin/ls", "-l"], bufsize=bufsize, stdin=PIPE, stdout=PIPE)
    345 (child_stdin, child_stdout) = (p.stdin, p.stdout)
    346 
    347 Return code handling translates as follows:
    348 
    349 pipe = os.popen("cmd", 'w')
    350 ...
    351 rc = pipe.close()
    352 if rc is not None and rc % 256:
    353     print "There were some errors"
    354 ==>
    355 process = Popen("cmd", 'w', shell=True, stdin=PIPE)
    356 ...
    357 process.stdin.close()
    358 if process.wait() != 0:
    359     print "There were some errors"
    360 
    361 
    362 Replacing popen2.*
    363 ------------------
    364 (child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)
    365 ==>
    366 p = Popen(["somestring"], shell=True, bufsize=bufsize
    367           stdin=PIPE, stdout=PIPE, close_fds=True)
    368 (child_stdout, child_stdin) = (p.stdout, p.stdin)
    369 
    370 On Unix, popen2 also accepts a sequence as the command to execute, in
    371 which case arguments will be passed directly to the program without
    372 shell intervention.  This usage can be replaced as follows:
    373 
    374 (child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize,
    375                                             mode)
    376 ==>
    377 p = Popen(["mycmd", "myarg"], bufsize=bufsize,
    378           stdin=PIPE, stdout=PIPE, close_fds=True)
    379 (child_stdout, child_stdin) = (p.stdout, p.stdin)
    380 
    381 The popen2.Popen3 and popen2.Popen4 basically works as subprocess.Popen,
    382 except that:
    383 
    384 * subprocess.Popen raises an exception if the execution fails
    385 * the capturestderr argument is replaced with the stderr argument.
    386 * stdin=PIPE and stdout=PIPE must be specified.
    387 * popen2 closes all filedescriptors by default, but you have to specify
    388   close_fds=True with subprocess.Popen.
    389 """
    390 
    391 import sys
    392 mswindows = (sys.platform == "win32")
    393 
    394 import os
    395 import types
    396 import traceback
    397 import gc
    398 import signal
    399 import errno
    400 
    401 # Exception classes used by this module.
    402 class CalledProcessError(Exception):
    403     """This exception is raised when a process run by check_call() or
    404     check_output() returns a non-zero exit status.
    405     The exit status will be stored in the returncode attribute;
    406     check_output() will also store the output in the output attribute.
    407     """
    408     def __init__(self, returncode, cmd, output=None):
    409         self.returncode = returncode
    410         self.cmd = cmd
    411         self.output = output
    412     def __str__(self):
    413         return "Command '%s' returned non-zero exit status %d" % (self.cmd, self.returncode)
    414 
    415 
    416 if mswindows:
    417     import threading
    418     import msvcrt
    419     import _subprocess
    420     class STARTUPINFO:
    421         dwFlags = 0
    422         hStdInput = None
    423         hStdOutput = None
    424         hStdError = None
    425         wShowWindow = 0
    426     class pywintypes:
    427         error = IOError
    428 else:
    429     import select
    430     _has_poll = hasattr(select, 'poll')
    431     import fcntl
    432     import pickle
    433 
    434     # When select or poll has indicated that the file is writable,
    435     # we can write up to _PIPE_BUF bytes without risk of blocking.
    436     # POSIX defines PIPE_BUF as >= 512.
    437     _PIPE_BUF = getattr(select, 'PIPE_BUF', 512)
    438 
    439 
    440 __all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call",
    441            "check_output", "CalledProcessError"]
    442 
    443 if mswindows:
    444     from _subprocess import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP,
    445                              STD_INPUT_HANDLE, STD_OUTPUT_HANDLE,
    446                              STD_ERROR_HANDLE, SW_HIDE,
    447                              STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW)
    448 
    449     __all__.extend(["CREATE_NEW_CONSOLE", "CREATE_NEW_PROCESS_GROUP",
    450                     "STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE",
    451                     "STD_ERROR_HANDLE", "SW_HIDE",
    452                     "STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW"])
    453 try:
    454     MAXFD = os.sysconf("SC_OPEN_MAX")
    455 except:
    456     MAXFD = 256
    457 
    458 _active = []
    459 
    460 def _cleanup():
    461     for inst in _active[:]:
    462         res = inst._internal_poll(_deadstate=sys.maxint)
    463         if res is not None:
    464             try:
    465                 _active.remove(inst)
    466             except ValueError:
    467                 # This can happen if two threads create a new Popen instance.
    468                 # It's harmless that it was already removed, so ignore.
    469                 pass
    470 
    471 PIPE = -1
    472 STDOUT = -2
    473 
    474 
    475 def _eintr_retry_call(func, *args):
    476     while True:
    477         try:
    478             return func(*args)
    479         except (OSError, IOError) as e:
    480             if e.errno == errno.EINTR:
    481                 continue
    482             raise
    483 
    484 
    485 # XXX This function is only used by multiprocessing and the test suite,
    486 # but it's here so that it can be imported when Python is compiled without
    487 # threads.
    488 
    489 def _args_from_interpreter_flags():
    490     """Return a list of command-line arguments reproducing the current
    491     settings in sys.flags and sys.warnoptions."""
    492     flag_opt_map = {
    493         'debug': 'd',
    494         # 'inspect': 'i',
    495         # 'interactive': 'i',
    496         'optimize': 'O',
    497         'dont_write_bytecode': 'B',
    498         'no_user_site': 's',
    499         'no_site': 'S',
    500         'ignore_environment': 'E',
    501         'verbose': 'v',
    502         'bytes_warning': 'b',
    503         'hash_randomization': 'R',
    504         'py3k_warning': '3',
    505     }
    506     args = []
    507     for flag, opt in flag_opt_map.items():
    508         v = getattr(sys.flags, flag)
    509         if v > 0:
    510             args.append('-' + opt * v)
    511     for opt in sys.warnoptions:
    512         args.append('-W' + opt)
    513     return args
    514 
    515 
    516 def call(*popenargs, **kwargs):
    517     """Run command with arguments.  Wait for command to complete, then
    518     return the returncode attribute.
    519 
    520     The arguments are the same as for the Popen constructor.  Example:
    521 
    522     retcode = call(["ls", "-l"])
    523     """
    524     return Popen(*popenargs, **kwargs).wait()
    525 
    526 
    527 def check_call(*popenargs, **kwargs):
    528     """Run command with arguments.  Wait for command to complete.  If
    529     the exit code was zero then return, otherwise raise
    530     CalledProcessError.  The CalledProcessError object will have the
    531     return code in the returncode attribute.
    532 
    533     The arguments are the same as for the Popen constructor.  Example:
    534 
    535     check_call(["ls", "-l"])
    536     """
    537     retcode = call(*popenargs, **kwargs)
    538     if retcode:
    539         cmd = kwargs.get("args")
    540         if cmd is None:
    541             cmd = popenargs[0]
    542         raise CalledProcessError(retcode, cmd)
    543     return 0
    544 
    545 
    546 def check_output(*popenargs, **kwargs):
    547     r"""Run command with arguments and return its output as a byte string.
    548 
    549     If the exit code was non-zero it raises a CalledProcessError.  The
    550     CalledProcessError object will have the return code in the returncode
    551     attribute and output in the output attribute.
    552 
    553     The arguments are the same as for the Popen constructor.  Example:
    554 
    555     >>> check_output(["ls", "-l", "/dev/null"])
    556     'crw-rw-rw- 1 root root 1, 3 Oct 18  2007 /dev/null\n'
    557 
    558     The stdout argument is not allowed as it is used internally.
    559     To capture standard error in the result, use stderr=STDOUT.
    560 
    561     >>> check_output(["/bin/sh", "-c",
    562     ...               "ls -l non_existent_file ; exit 0"],
    563     ...              stderr=STDOUT)
    564     'ls: non_existent_file: No such file or directory\n'
    565     """
    566     if 'stdout' in kwargs:
    567         raise ValueError('stdout argument not allowed, it will be overridden.')
    568     process = Popen(stdout=PIPE, *popenargs, **kwargs)
    569     output, unused_err = process.communicate()
    570     retcode = process.poll()
    571     if retcode:
    572         cmd = kwargs.get("args")
    573         if cmd is None:
    574             cmd = popenargs[0]
    575         raise CalledProcessError(retcode, cmd, output=output)
    576     return output
    577 
    578 
    579 def list2cmdline(seq):
    580     """
    581     Translate a sequence of arguments into a command line
    582     string, using the same rules as the MS C runtime:
    583 
    584     1) Arguments are delimited by white space, which is either a
    585        space or a tab.
    586 
    587     2) A string surrounded by double quotation marks is
    588        interpreted as a single argument, regardless of white space
    589        contained within.  A quoted string can be embedded in an
    590        argument.
    591 
    592     3) A double quotation mark preceded by a backslash is
    593        interpreted as a literal double quotation mark.
    594 
    595     4) Backslashes are interpreted literally, unless they
    596        immediately precede a double quotation mark.
    597 
    598     5) If backslashes immediately precede a double quotation mark,
    599        every pair of backslashes is interpreted as a literal
    600        backslash.  If the number of backslashes is odd, the last
    601        backslash escapes the next double quotation mark as
    602        described in rule 3.
    603     """
    604 
    605     # See
    606     # http://msdn.microsoft.com/en-us/library/17w5ykft.aspx
    607     # or search http://msdn.microsoft.com for
    608     # "Parsing C++ Command-Line Arguments"
    609     result = []
    610     needquote = False
    611     for arg in seq:
    612         bs_buf = []
    613 
    614         # Add a space to separate this argument from the others
    615         if result:
    616             result.append(' ')
    617 
    618         needquote = (" " in arg) or ("\t" in arg) or not arg
    619         if needquote:
    620             result.append('"')
    621 
    622         for c in arg:
    623             if c == '\\':
    624                 # Don't know if we need to double yet.
    625                 bs_buf.append(c)
    626             elif c == '"':
    627                 # Double backslashes.
    628                 result.append('\\' * len(bs_buf)*2)
    629                 bs_buf = []
    630                 result.append('\\"')
    631             else:
    632                 # Normal char
    633                 if bs_buf:
    634                     result.extend(bs_buf)
    635                     bs_buf = []
    636                 result.append(c)
    637 
    638         # Add remaining backslashes, if any.
    639         if bs_buf:
    640             result.extend(bs_buf)
    641 
    642         if needquote:
    643             result.extend(bs_buf)
    644             result.append('"')
    645 
    646     return ''.join(result)
    647 
    648 
    649 class Popen(object):
    650     def __init__(self, args, bufsize=0, executable=None,
    651                  stdin=None, stdout=None, stderr=None,
    652                  preexec_fn=None, close_fds=False, shell=False,
    653                  cwd=None, env=None, universal_newlines=False,
    654                  startupinfo=None, creationflags=0):
    655         """Create new Popen instance."""
    656         _cleanup()
    657 
    658         self._child_created = False
    659         if not isinstance(bufsize, (int, long)):
    660             raise TypeError("bufsize must be an integer")
    661 
    662         if mswindows:
    663             if preexec_fn is not None:
    664                 raise ValueError("preexec_fn is not supported on Windows "
    665                                  "platforms")
    666             if close_fds and (stdin is not None or stdout is not None or
    667                               stderr is not None):
    668                 raise ValueError("close_fds is not supported on Windows "
    669                                  "platforms if you redirect stdin/stdout/stderr")
    670         else:
    671             # POSIX
    672             if startupinfo is not None:
    673                 raise ValueError("startupinfo is only supported on Windows "
    674                                  "platforms")
    675             if creationflags != 0:
    676                 raise ValueError("creationflags is only supported on Windows "
    677                                  "platforms")
    678 
    679         self.stdin = None
    680         self.stdout = None
    681         self.stderr = None
    682         self.pid = None
    683         self.returncode = None
    684         self.universal_newlines = universal_newlines
    685 
    686         # Input and output objects. The general principle is like
    687         # this:
    688         #
    689         # Parent                   Child
    690         # ------                   -----
    691         # p2cwrite   ---stdin--->  p2cread
    692         # c2pread    <--stdout---  c2pwrite
    693         # errread    <--stderr---  errwrite
    694         #
    695         # On POSIX, the child objects are file descriptors.  On
    696         # Windows, these are Windows file handles.  The parent objects
    697         # are file descriptors on both platforms.  The parent objects
    698         # are None when not using PIPEs. The child objects are None
    699         # when not redirecting.
    700 
    701         (p2cread, p2cwrite,
    702          c2pread, c2pwrite,
    703          errread, errwrite) = self._get_handles(stdin, stdout, stderr)
    704 
    705         try:
    706             self._execute_child(args, executable, preexec_fn, close_fds,
    707                                 cwd, env, universal_newlines,
    708                                 startupinfo, creationflags, shell,
    709                                 p2cread, p2cwrite,
    710                                 c2pread, c2pwrite,
    711                                 errread, errwrite)
    712         except Exception:
    713             # Preserve original exception in case os.close raises.
    714             exc_type, exc_value, exc_trace = sys.exc_info()
    715 
    716             to_close = []
    717             # Only close the pipes we created.
    718             if stdin == PIPE:
    719                 to_close.extend((p2cread, p2cwrite))
    720             if stdout == PIPE:
    721                 to_close.extend((c2pread, c2pwrite))
    722             if stderr == PIPE:
    723                 to_close.extend((errread, errwrite))
    724 
    725             for fd in to_close:
    726                 try:
    727                     os.close(fd)
    728                 except EnvironmentError:
    729                     pass
    730 
    731             raise exc_type, exc_value, exc_trace
    732 
    733         if mswindows:
    734             if p2cwrite is not None:
    735                 p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0)
    736             if c2pread is not None:
    737                 c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0)
    738             if errread is not None:
    739                 errread = msvcrt.open_osfhandle(errread.Detach(), 0)
    740 
    741         if p2cwrite is not None:
    742             self.stdin = os.fdopen(p2cwrite, 'wb', bufsize)
    743         if c2pread is not None:
    744             if universal_newlines:
    745                 self.stdout = os.fdopen(c2pread, 'rU', bufsize)
    746             else:
    747                 self.stdout = os.fdopen(c2pread, 'rb', bufsize)
    748         if errread is not None:
    749             if universal_newlines:
    750                 self.stderr = os.fdopen(errread, 'rU', bufsize)
    751             else:
    752                 self.stderr = os.fdopen(errread, 'rb', bufsize)
    753 
    754 
    755     def _translate_newlines(self, data):
    756         data = data.replace("\r\n", "\n")
    757         data = data.replace("\r", "\n")
    758         return data
    759 
    760 
    761     def __del__(self, _maxint=sys.maxint, _active=_active):
    762         # If __init__ hasn't had a chance to execute (e.g. if it
    763         # was passed an undeclared keyword argument), we don't
    764         # have a _child_created attribute at all.
    765         if not getattr(self, '_child_created', False):
    766             # We didn't get to successfully create a child process.
    767             return
    768         # In case the child hasn't been waited on, check if it's done.
    769         self._internal_poll(_deadstate=_maxint)
    770         if self.returncode is None and _active is not None:
    771             # Child is still running, keep us alive until we can wait on it.
    772             _active.append(self)
    773 
    774 
    775     def communicate(self, input=None):
    776         """Interact with process: Send data to stdin.  Read data from
    777         stdout and stderr, until end-of-file is reached.  Wait for
    778         process to terminate.  The optional input argument should be a
    779         string to be sent to the child process, or None, if no data
    780         should be sent to the child.
    781 
    782         communicate() returns a tuple (stdout, stderr)."""
    783 
    784         # Optimization: If we are only using one pipe, or no pipe at
    785         # all, using select() or threads is unnecessary.
    786         if [self.stdin, self.stdout, self.stderr].count(None) >= 2:
    787             stdout = None
    788             stderr = None
    789             if self.stdin:
    790                 if input:
    791                     try:
    792                         self.stdin.write(input)
    793                     except IOError as e:
    794                         if e.errno != errno.EPIPE and e.errno != errno.EINVAL:
    795                             raise
    796                 self.stdin.close()
    797             elif self.stdout:
    798                 stdout = _eintr_retry_call(self.stdout.read)
    799                 self.stdout.close()
    800             elif self.stderr:
    801                 stderr = _eintr_retry_call(self.stderr.read)
    802                 self.stderr.close()
    803             self.wait()
    804             return (stdout, stderr)
    805 
    806         return self._communicate(input)
    807 
    808 
    809     def poll(self):
    810         return self._internal_poll()
    811 
    812 
    813     if mswindows:
    814         #
    815         # Windows methods
    816         #
    817         def _get_handles(self, stdin, stdout, stderr):
    818             """Construct and return tuple with IO objects:
    819             p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
    820             """
    821             if stdin is None and stdout is None and stderr is None:
    822                 return (None, None, None, None, None, None)
    823 
    824             p2cread, p2cwrite = None, None
    825             c2pread, c2pwrite = None, None
    826             errread, errwrite = None, None
    827 
    828             if stdin is None:
    829                 p2cread = _subprocess.GetStdHandle(_subprocess.STD_INPUT_HANDLE)
    830                 if p2cread is None:
    831                     p2cread, _ = _subprocess.CreatePipe(None, 0)
    832             elif stdin == PIPE:
    833                 p2cread, p2cwrite = _subprocess.CreatePipe(None, 0)
    834             elif isinstance(stdin, int):
    835                 p2cread = msvcrt.get_osfhandle(stdin)
    836             else:
    837                 # Assuming file-like object
    838                 p2cread = msvcrt.get_osfhandle(stdin.fileno())
    839             p2cread = self._make_inheritable(p2cread)
    840 
    841             if stdout is None:
    842                 c2pwrite = _subprocess.GetStdHandle(_subprocess.STD_OUTPUT_HANDLE)
    843                 if c2pwrite is None:
    844                     _, c2pwrite = _subprocess.CreatePipe(None, 0)
    845             elif stdout == PIPE:
    846                 c2pread, c2pwrite = _subprocess.CreatePipe(None, 0)
    847             elif isinstance(stdout, int):
    848                 c2pwrite = msvcrt.get_osfhandle(stdout)
    849             else:
    850                 # Assuming file-like object
    851                 c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
    852             c2pwrite = self._make_inheritable(c2pwrite)
    853 
    854             if stderr is None:
    855                 errwrite = _subprocess.GetStdHandle(_subprocess.STD_ERROR_HANDLE)
    856                 if errwrite is None:
    857                     _, errwrite = _subprocess.CreatePipe(None, 0)
    858             elif stderr == PIPE:
    859                 errread, errwrite = _subprocess.CreatePipe(None, 0)
    860             elif stderr == STDOUT:
    861                 errwrite = c2pwrite
    862             elif isinstance(stderr, int):
    863                 errwrite = msvcrt.get_osfhandle(stderr)
    864             else:
    865                 # Assuming file-like object
    866                 errwrite = msvcrt.get_osfhandle(stderr.fileno())
    867             errwrite = self._make_inheritable(errwrite)
    868 
    869             return (p2cread, p2cwrite,
    870                     c2pread, c2pwrite,
    871                     errread, errwrite)
    872 
    873 
    874         def _make_inheritable(self, handle):
    875             """Return a duplicate of handle, which is inheritable"""
    876             return _subprocess.DuplicateHandle(_subprocess.GetCurrentProcess(),
    877                                 handle, _subprocess.GetCurrentProcess(), 0, 1,
    878                                 _subprocess.DUPLICATE_SAME_ACCESS)
    879 
    880 
    881         def _find_w9xpopen(self):
    882             """Find and return absolut path to w9xpopen.exe"""
    883             w9xpopen = os.path.join(
    884                             os.path.dirname(_subprocess.GetModuleFileName(0)),
    885                                     "w9xpopen.exe")
    886             if not os.path.exists(w9xpopen):
    887                 # Eeek - file-not-found - possibly an embedding
    888                 # situation - see if we can locate it in sys.exec_prefix
    889                 w9xpopen = os.path.join(os.path.dirname(sys.exec_prefix),
    890                                         "w9xpopen.exe")
    891                 if not os.path.exists(w9xpopen):
    892                     raise RuntimeError("Cannot locate w9xpopen.exe, which is "
    893                                        "needed for Popen to work with your "
    894                                        "shell or platform.")
    895             return w9xpopen
    896 
    897 
    898         def _execute_child(self, args, executable, preexec_fn, close_fds,
    899                            cwd, env, universal_newlines,
    900                            startupinfo, creationflags, shell,
    901                            p2cread, p2cwrite,
    902                            c2pread, c2pwrite,
    903                            errread, errwrite):
    904             """Execute program (MS Windows version)"""
    905 
    906             if not isinstance(args, types.StringTypes):
    907                 args = list2cmdline(args)
    908 
    909             # Process startup details
    910             if startupinfo is None:
    911                 startupinfo = STARTUPINFO()
    912             if None not in (p2cread, c2pwrite, errwrite):
    913                 startupinfo.dwFlags |= _subprocess.STARTF_USESTDHANDLES
    914                 startupinfo.hStdInput = p2cread
    915                 startupinfo.hStdOutput = c2pwrite
    916                 startupinfo.hStdError = errwrite
    917 
    918             if shell:
    919                 startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW
    920                 startupinfo.wShowWindow = _subprocess.SW_HIDE
    921                 comspec = os.environ.get("COMSPEC", "cmd.exe")
    922                 args = '{} /c "{}"'.format (comspec, args)
    923                 if (_subprocess.GetVersion() >= 0x80000000 or
    924                         os.path.basename(comspec).lower() == "command.com"):
    925                     # Win9x, or using command.com on NT. We need to
    926                     # use the w9xpopen intermediate program. For more
    927                     # information, see KB Q150956
    928                     # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp)
    929                     w9xpopen = self._find_w9xpopen()
    930                     args = '"%s" %s' % (w9xpopen, args)
    931                     # Not passing CREATE_NEW_CONSOLE has been known to
    932                     # cause random failures on win9x.  Specifically a
    933                     # dialog: "Your program accessed mem currently in
    934                     # use at xxx" and a hopeful warning about the
    935                     # stability of your system.  Cost is Ctrl+C wont
    936                     # kill children.
    937                     creationflags |= _subprocess.CREATE_NEW_CONSOLE
    938 
    939             # Start the process
    940             try:
    941                 hp, ht, pid, tid = _subprocess.CreateProcess(executable, args,
    942                                          # no special security
    943                                          None, None,
    944                                          int(not close_fds),
    945                                          creationflags,
    946                                          env,
    947                                          cwd,
    948                                          startupinfo)
    949             except pywintypes.error, e:
    950                 # Translate pywintypes.error to WindowsError, which is
    951                 # a subclass of OSError.  FIXME: We should really
    952                 # translate errno using _sys_errlist (or similar), but
    953                 # how can this be done from Python?
    954                 raise WindowsError(*e.args)
    955             finally:
    956                 # Child is launched. Close the parent's copy of those pipe
    957                 # handles that only the child should have open.  You need
    958                 # to make sure that no handles to the write end of the
    959                 # output pipe are maintained in this process or else the
    960                 # pipe will not close when the child process exits and the
    961                 # ReadFile will hang.
    962                 if p2cread is not None:
    963                     p2cread.Close()
    964                 if c2pwrite is not None:
    965                     c2pwrite.Close()
    966                 if errwrite is not None:
    967                     errwrite.Close()
    968 
    969             # Retain the process handle, but close the thread handle
    970             self._child_created = True
    971             self._handle = hp
    972             self.pid = pid
    973             ht.Close()
    974 
    975         def _internal_poll(self, _deadstate=None,
    976                 _WaitForSingleObject=_subprocess.WaitForSingleObject,
    977                 _WAIT_OBJECT_0=_subprocess.WAIT_OBJECT_0,
    978                 _GetExitCodeProcess=_subprocess.GetExitCodeProcess):
    979             """Check if child process has terminated.  Returns returncode
    980             attribute.
    981 
    982             This method is called by __del__, so it can only refer to objects
    983             in its local scope.
    984 
    985             """
    986             if self.returncode is None:
    987                 if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0:
    988                     self.returncode = _GetExitCodeProcess(self._handle)
    989             return self.returncode
    990 
    991 
    992         def wait(self):
    993             """Wait for child process to terminate.  Returns returncode
    994             attribute."""
    995             if self.returncode is None:
    996                 _subprocess.WaitForSingleObject(self._handle,
    997                                                 _subprocess.INFINITE)
    998                 self.returncode = _subprocess.GetExitCodeProcess(self._handle)
    999             return self.returncode
   1000 
   1001 
   1002         def _readerthread(self, fh, buffer):
   1003             buffer.append(fh.read())
   1004 
   1005 
   1006         def _communicate(self, input):
   1007             stdout = None # Return
   1008             stderr = None # Return
   1009 
   1010             if self.stdout:
   1011                 stdout = []
   1012                 stdout_thread = threading.Thread(target=self._readerthread,
   1013                                                  args=(self.stdout, stdout))
   1014                 stdout_thread.setDaemon(True)
   1015                 stdout_thread.start()
   1016             if self.stderr:
   1017                 stderr = []
   1018                 stderr_thread = threading.Thread(target=self._readerthread,
   1019                                                  args=(self.stderr, stderr))
   1020                 stderr_thread.setDaemon(True)
   1021                 stderr_thread.start()
   1022 
   1023             if self.stdin:
   1024                 if input is not None:
   1025                     try:
   1026                         self.stdin.write(input)
   1027                     except IOError as e:
   1028                         if e.errno != errno.EPIPE:
   1029                             raise
   1030                 self.stdin.close()
   1031 
   1032             if self.stdout:
   1033                 stdout_thread.join()
   1034             if self.stderr:
   1035                 stderr_thread.join()
   1036 
   1037             # All data exchanged.  Translate lists into strings.
   1038             if stdout is not None:
   1039                 stdout = stdout[0]
   1040             if stderr is not None:
   1041                 stderr = stderr[0]
   1042 
   1043             # Translate newlines, if requested.  We cannot let the file
   1044             # object do the translation: It is based on stdio, which is
   1045             # impossible to combine with select (unless forcing no
   1046             # buffering).
   1047             if self.universal_newlines and hasattr(file, 'newlines'):
   1048                 if stdout:
   1049                     stdout = self._translate_newlines(stdout)
   1050                 if stderr:
   1051                     stderr = self._translate_newlines(stderr)
   1052 
   1053             self.wait()
   1054             return (stdout, stderr)
   1055 
   1056         def send_signal(self, sig):
   1057             """Send a signal to the process
   1058             """
   1059             if sig == signal.SIGTERM:
   1060                 self.terminate()
   1061             elif sig == signal.CTRL_C_EVENT:
   1062                 os.kill(self.pid, signal.CTRL_C_EVENT)
   1063             elif sig == signal.CTRL_BREAK_EVENT:
   1064                 os.kill(self.pid, signal.CTRL_BREAK_EVENT)
   1065             else:
   1066                 raise ValueError("Unsupported signal: {}".format(sig))
   1067 
   1068         def terminate(self):
   1069             """Terminates the process
   1070             """
   1071             try:
   1072                 _subprocess.TerminateProcess(self._handle, 1)
   1073             except OSError as e:
   1074                 # ERROR_ACCESS_DENIED (winerror 5) is received when the
   1075                 # process already died.
   1076                 if e.winerror != 5:
   1077                     raise
   1078                 rc = _subprocess.GetExitCodeProcess(self._handle)
   1079                 if rc == _subprocess.STILL_ACTIVE:
   1080                     raise
   1081                 self.returncode = rc
   1082 
   1083         kill = terminate
   1084 
   1085     else:
   1086         #
   1087         # POSIX methods
   1088         #
   1089         def _get_handles(self, stdin, stdout, stderr):
   1090             """Construct and return tuple with IO objects:
   1091             p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
   1092             """
   1093             p2cread, p2cwrite = None, None
   1094             c2pread, c2pwrite = None, None
   1095             errread, errwrite = None, None
   1096 
   1097             if stdin is None:
   1098                 pass
   1099             elif stdin == PIPE:
   1100                 p2cread, p2cwrite = self.pipe_cloexec()
   1101             elif isinstance(stdin, int):
   1102                 p2cread = stdin
   1103             else:
   1104                 # Assuming file-like object
   1105                 p2cread = stdin.fileno()
   1106 
   1107             if stdout is None:
   1108                 pass
   1109             elif stdout == PIPE:
   1110                 c2pread, c2pwrite = self.pipe_cloexec()
   1111             elif isinstance(stdout, int):
   1112                 c2pwrite = stdout
   1113             else:
   1114                 # Assuming file-like object
   1115                 c2pwrite = stdout.fileno()
   1116 
   1117             if stderr is None:
   1118                 pass
   1119             elif stderr == PIPE:
   1120                 errread, errwrite = self.pipe_cloexec()
   1121             elif stderr == STDOUT:
   1122                 errwrite = c2pwrite
   1123             elif isinstance(stderr, int):
   1124                 errwrite = stderr
   1125             else:
   1126                 # Assuming file-like object
   1127                 errwrite = stderr.fileno()
   1128 
   1129             return (p2cread, p2cwrite,
   1130                     c2pread, c2pwrite,
   1131                     errread, errwrite)
   1132 
   1133 
   1134         def _set_cloexec_flag(self, fd, cloexec=True):
   1135             try:
   1136                 cloexec_flag = fcntl.FD_CLOEXEC
   1137             except AttributeError:
   1138                 cloexec_flag = 1
   1139 
   1140             old = fcntl.fcntl(fd, fcntl.F_GETFD)
   1141             if cloexec:
   1142                 fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag)
   1143             else:
   1144                 fcntl.fcntl(fd, fcntl.F_SETFD, old & ~cloexec_flag)
   1145 
   1146 
   1147         def pipe_cloexec(self):
   1148             """Create a pipe with FDs set CLOEXEC."""
   1149             # Pipes' FDs are set CLOEXEC by default because we don't want them
   1150             # to be inherited by other subprocesses: the CLOEXEC flag is removed
   1151             # from the child's FDs by _dup2(), between fork() and exec().
   1152             # This is not atomic: we would need the pipe2() syscall for that.
   1153             r, w = os.pipe()
   1154             self._set_cloexec_flag(r)
   1155             self._set_cloexec_flag(w)
   1156             return r, w
   1157 
   1158 
   1159         def _close_fds(self, but):
   1160             if hasattr(os, 'closerange'):
   1161                 os.closerange(3, but)
   1162                 os.closerange(but + 1, MAXFD)
   1163             else:
   1164                 for i in xrange(3, MAXFD):
   1165                     if i == but:
   1166                         continue
   1167                     try:
   1168                         os.close(i)
   1169                     except:
   1170                         pass
   1171 
   1172 
   1173         def _execute_child(self, args, executable, preexec_fn, close_fds,
   1174                            cwd, env, universal_newlines,
   1175                            startupinfo, creationflags, shell,
   1176                            p2cread, p2cwrite,
   1177                            c2pread, c2pwrite,
   1178                            errread, errwrite):
   1179             """Execute program (POSIX version)"""
   1180 
   1181             if isinstance(args, types.StringTypes):
   1182                 args = [args]
   1183             else:
   1184                 args = list(args)
   1185 
   1186             if shell:
   1187                 args = ["/bin/sh", "-c"] + args
   1188                 if executable:
   1189                     args[0] = executable
   1190 
   1191             if executable is None:
   1192                 executable = args[0]
   1193 
   1194             # For transferring possible exec failure from child to parent
   1195             # The first char specifies the exception type: 0 means
   1196             # OSError, 1 means some other error.
   1197             errpipe_read, errpipe_write = self.pipe_cloexec()
   1198             try:
   1199                 try:
   1200                     gc_was_enabled = gc.isenabled()
   1201                     # Disable gc to avoid bug where gc -> file_dealloc ->
   1202                     # write to stderr -> hang.  http://bugs.python.org/issue1336
   1203                     gc.disable()
   1204                     try:
   1205                         self.pid = os.fork()
   1206                     except:
   1207                         if gc_was_enabled:
   1208                             gc.enable()
   1209                         raise
   1210                     self._child_created = True
   1211                     if self.pid == 0:
   1212                         # Child
   1213                         try:
   1214                             # Close parent's pipe ends
   1215                             if p2cwrite is not None:
   1216                                 os.close(p2cwrite)
   1217                             if c2pread is not None:
   1218                                 os.close(c2pread)
   1219                             if errread is not None:
   1220                                 os.close(errread)
   1221                             os.close(errpipe_read)
   1222 
   1223                             # When duping fds, if there arises a situation
   1224                             # where one of the fds is either 0, 1 or 2, it
   1225                             # is possible that it is overwritten (#12607).
   1226                             if c2pwrite == 0:
   1227                                 c2pwrite = os.dup(c2pwrite)
   1228                             if errwrite == 0 or errwrite == 1:
   1229                                 errwrite = os.dup(errwrite)
   1230 
   1231                             # Dup fds for child
   1232                             def _dup2(a, b):
   1233                                 # dup2() removes the CLOEXEC flag but
   1234                                 # we must do it ourselves if dup2()
   1235                                 # would be a no-op (issue #10806).
   1236                                 if a == b:
   1237                                     self._set_cloexec_flag(a, False)
   1238                                 elif a is not None:
   1239                                     os.dup2(a, b)
   1240                             _dup2(p2cread, 0)
   1241                             _dup2(c2pwrite, 1)
   1242                             _dup2(errwrite, 2)
   1243 
   1244                             # Close pipe fds.  Make sure we don't close the
   1245                             # same fd more than once, or standard fds.
   1246                             closed = { None }
   1247                             for fd in [p2cread, c2pwrite, errwrite]:
   1248                                 if fd not in closed and fd > 2:
   1249                                     os.close(fd)
   1250                                     closed.add(fd)
   1251 
   1252                             # Close all other fds, if asked for
   1253                             if close_fds:
   1254                                 self._close_fds(but=errpipe_write)
   1255 
   1256                             if cwd is not None:
   1257                                 os.chdir(cwd)
   1258 
   1259                             if preexec_fn:
   1260                                 preexec_fn()
   1261 
   1262                             if env is None:
   1263                                 os.execvp(executable, args)
   1264                             else:
   1265                                 os.execvpe(executable, args, env)
   1266 
   1267                         except:
   1268                             exc_type, exc_value, tb = sys.exc_info()
   1269                             # Save the traceback and attach it to the exception object
   1270                             exc_lines = traceback.format_exception(exc_type,
   1271                                                                    exc_value,
   1272                                                                    tb)
   1273                             exc_value.child_traceback = ''.join(exc_lines)
   1274                             os.write(errpipe_write, pickle.dumps(exc_value))
   1275 
   1276                         # This exitcode won't be reported to applications, so it
   1277                         # really doesn't matter what we return.
   1278                         os._exit(255)
   1279 
   1280                     # Parent
   1281                     if gc_was_enabled:
   1282                         gc.enable()
   1283                 finally:
   1284                     # be sure the FD is closed no matter what
   1285                     os.close(errpipe_write)
   1286 
   1287                 if p2cread is not None and p2cwrite is not None:
   1288                     os.close(p2cread)
   1289                 if c2pwrite is not None and c2pread is not None:
   1290                     os.close(c2pwrite)
   1291                 if errwrite is not None and errread is not None:
   1292                     os.close(errwrite)
   1293 
   1294                 # Wait for exec to fail or succeed; possibly raising exception
   1295                 # Exception limited to 1M
   1296                 data = _eintr_retry_call(os.read, errpipe_read, 1048576)
   1297             finally:
   1298                 # be sure the FD is closed no matter what
   1299                 os.close(errpipe_read)
   1300 
   1301             if data != "":
   1302                 try:
   1303                     _eintr_retry_call(os.waitpid, self.pid, 0)
   1304                 except OSError as e:
   1305                     if e.errno != errno.ECHILD:
   1306                         raise
   1307                 child_exception = pickle.loads(data)
   1308                 raise child_exception
   1309 
   1310 
   1311         def _handle_exitstatus(self, sts, _WIFSIGNALED=os.WIFSIGNALED,
   1312                 _WTERMSIG=os.WTERMSIG, _WIFEXITED=os.WIFEXITED,
   1313                 _WEXITSTATUS=os.WEXITSTATUS):
   1314             # This method is called (indirectly) by __del__, so it cannot
   1315             # refer to anything outside of its local scope."""
   1316             if _WIFSIGNALED(sts):
   1317                 self.returncode = -_WTERMSIG(sts)
   1318             elif _WIFEXITED(sts):
   1319                 self.returncode = _WEXITSTATUS(sts)
   1320             else:
   1321                 # Should never happen
   1322                 raise RuntimeError("Unknown child exit status!")
   1323 
   1324 
   1325         def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid,
   1326                 _WNOHANG=os.WNOHANG, _os_error=os.error, _ECHILD=errno.ECHILD):
   1327             """Check if child process has terminated.  Returns returncode
   1328             attribute.
   1329 
   1330             This method is called by __del__, so it cannot reference anything
   1331             outside of the local scope (nor can any methods it calls).
   1332 
   1333             """
   1334             if self.returncode is None:
   1335                 try:
   1336                     pid, sts = _waitpid(self.pid, _WNOHANG)
   1337                     if pid == self.pid:
   1338                         self._handle_exitstatus(sts)
   1339                 except _os_error as e:
   1340                     if _deadstate is not None:
   1341                         self.returncode = _deadstate
   1342                     if e.errno == _ECHILD:
   1343                         # This happens if SIGCLD is set to be ignored or
   1344                         # waiting for child processes has otherwise been
   1345                         # disabled for our process.  This child is dead, we
   1346                         # can't get the status.
   1347                         # http://bugs.python.org/issue15756
   1348                         self.returncode = 0
   1349             return self.returncode
   1350 
   1351 
   1352         def wait(self):
   1353             """Wait for child process to terminate.  Returns returncode
   1354             attribute."""
   1355             while self.returncode is None:
   1356                 try:
   1357                     pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0)
   1358                 except OSError as e:
   1359                     if e.errno != errno.ECHILD:
   1360                         raise
   1361                     # This happens if SIGCLD is set to be ignored or waiting
   1362                     # for child processes has otherwise been disabled for our
   1363                     # process.  This child is dead, we can't get the status.
   1364                     pid = self.pid
   1365                     sts = 0
   1366                 # Check the pid and loop as waitpid has been known to return
   1367                 # 0 even without WNOHANG in odd situations.  issue14396.
   1368                 if pid == self.pid:
   1369                     self._handle_exitstatus(sts)
   1370             return self.returncode
   1371 
   1372 
   1373         def _communicate(self, input):
   1374             if self.stdin:
   1375                 # Flush stdio buffer.  This might block, if the user has
   1376                 # been writing to .stdin in an uncontrolled fashion.
   1377                 self.stdin.flush()
   1378                 if not input:
   1379                     self.stdin.close()
   1380 
   1381             if _has_poll:
   1382                 stdout, stderr = self._communicate_with_poll(input)
   1383             else:
   1384                 stdout, stderr = self._communicate_with_select(input)
   1385 
   1386             # All data exchanged.  Translate lists into strings.
   1387             if stdout is not None:
   1388                 stdout = ''.join(stdout)
   1389             if stderr is not None:
   1390                 stderr = ''.join(stderr)
   1391 
   1392             # Translate newlines, if requested.  We cannot let the file
   1393             # object do the translation: It is based on stdio, which is
   1394             # impossible to combine with select (unless forcing no
   1395             # buffering).
   1396             if self.universal_newlines and hasattr(file, 'newlines'):
   1397                 if stdout:
   1398                     stdout = self._translate_newlines(stdout)
   1399                 if stderr:
   1400                     stderr = self._translate_newlines(stderr)
   1401 
   1402             self.wait()
   1403             return (stdout, stderr)
   1404 
   1405 
   1406         def _communicate_with_poll(self, input):
   1407             stdout = None # Return
   1408             stderr = None # Return
   1409             fd2file = {}
   1410             fd2output = {}
   1411 
   1412             poller = select.poll()
   1413             def register_and_append(file_obj, eventmask):
   1414                 poller.register(file_obj.fileno(), eventmask)
   1415                 fd2file[file_obj.fileno()] = file_obj
   1416 
   1417             def close_unregister_and_remove(fd):
   1418                 poller.unregister(fd)
   1419                 fd2file[fd].close()
   1420                 fd2file.pop(fd)
   1421 
   1422             if self.stdin and input:
   1423                 register_and_append(self.stdin, select.POLLOUT)
   1424 
   1425             select_POLLIN_POLLPRI = select.POLLIN | select.POLLPRI
   1426             if self.stdout:
   1427                 register_and_append(self.stdout, select_POLLIN_POLLPRI)
   1428                 fd2output[self.stdout.fileno()] = stdout = []
   1429             if self.stderr:
   1430                 register_and_append(self.stderr, select_POLLIN_POLLPRI)
   1431                 fd2output[self.stderr.fileno()] = stderr = []
   1432 
   1433             input_offset = 0
   1434             while fd2file:
   1435                 try:
   1436                     ready = poller.poll()
   1437                 except select.error, e:
   1438                     if e.args[0] == errno.EINTR:
   1439                         continue
   1440                     raise
   1441 
   1442                 for fd, mode in ready:
   1443                     if mode & select.POLLOUT:
   1444                         chunk = input[input_offset : input_offset + _PIPE_BUF]
   1445                         try:
   1446                             input_offset += os.write(fd, chunk)
   1447                         except OSError as e:
   1448                             if e.errno == errno.EPIPE:
   1449                                 close_unregister_and_remove(fd)
   1450                             else:
   1451                                 raise
   1452                         else:
   1453                             if input_offset >= len(input):
   1454                                 close_unregister_and_remove(fd)
   1455                     elif mode & select_POLLIN_POLLPRI:
   1456                         data = os.read(fd, 4096)
   1457                         if not data:
   1458                             close_unregister_and_remove(fd)
   1459                         fd2output[fd].append(data)
   1460                     else:
   1461                         # Ignore hang up or errors.
   1462                         close_unregister_and_remove(fd)
   1463 
   1464             return (stdout, stderr)
   1465 
   1466 
   1467         def _communicate_with_select(self, input):
   1468             read_set = []
   1469             write_set = []
   1470             stdout = None # Return
   1471             stderr = None # Return
   1472 
   1473             if self.stdin and input:
   1474                 write_set.append(self.stdin)
   1475             if self.stdout:
   1476                 read_set.append(self.stdout)
   1477                 stdout = []
   1478             if self.stderr:
   1479                 read_set.append(self.stderr)
   1480                 stderr = []
   1481 
   1482             input_offset = 0
   1483             while read_set or write_set:
   1484                 try:
   1485                     rlist, wlist, xlist = select.select(read_set, write_set, [])
   1486                 except select.error, e:
   1487                     if e.args[0] == errno.EINTR:
   1488                         continue
   1489                     raise
   1490 
   1491                 if self.stdin in wlist:
   1492                     chunk = input[input_offset : input_offset + _PIPE_BUF]
   1493                     try:
   1494                         bytes_written = os.write(self.stdin.fileno(), chunk)
   1495                     except OSError as e:
   1496                         if e.errno == errno.EPIPE:
   1497                             self.stdin.close()
   1498                             write_set.remove(self.stdin)
   1499                         else:
   1500                             raise
   1501                     else:
   1502                         input_offset += bytes_written
   1503                         if input_offset >= len(input):
   1504                             self.stdin.close()
   1505                             write_set.remove(self.stdin)
   1506 
   1507                 if self.stdout in rlist:
   1508                     data = os.read(self.stdout.fileno(), 1024)
   1509                     if data == "":
   1510                         self.stdout.close()
   1511                         read_set.remove(self.stdout)
   1512                     stdout.append(data)
   1513 
   1514                 if self.stderr in rlist:
   1515                     data = os.read(self.stderr.fileno(), 1024)
   1516                     if data == "":
   1517                         self.stderr.close()
   1518                         read_set.remove(self.stderr)
   1519                     stderr.append(data)
   1520 
   1521             return (stdout, stderr)
   1522 
   1523 
   1524         def send_signal(self, sig):
   1525             """Send a signal to the process
   1526             """
   1527             os.kill(self.pid, sig)
   1528 
   1529         def terminate(self):
   1530             """Terminate the process with SIGTERM
   1531             """
   1532             self.send_signal(signal.SIGTERM)
   1533 
   1534         def kill(self):
   1535             """Kill the process with SIGKILL
   1536             """
   1537             self.send_signal(signal.SIGKILL)
   1538 
   1539 
   1540 def _demo_posix():
   1541     #
   1542     # Example 1: Simple redirection: Get process list
   1543     #
   1544     plist = Popen(["ps"], stdout=PIPE).communicate()[0]
   1545     print "Process list:"
   1546     print plist
   1547 
   1548     #
   1549     # Example 2: Change uid before executing child
   1550     #
   1551     if os.getuid() == 0:
   1552         p = Popen(["id"], preexec_fn=lambda: os.setuid(100))
   1553         p.wait()
   1554 
   1555     #
   1556     # Example 3: Connecting several subprocesses
   1557     #
   1558     print "Looking for 'hda'..."
   1559     p1 = Popen(["dmesg"], stdout=PIPE)
   1560     p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
   1561     print repr(p2.communicate()[0])
   1562 
   1563     #
   1564     # Example 4: Catch execution error
   1565     #
   1566     print
   1567     print "Trying a weird file..."
   1568     try:
   1569         print Popen(["/this/path/does/not/exist"]).communicate()
   1570     except OSError, e:
   1571         if e.errno == errno.ENOENT:
   1572             print "The file didn't exist.  I thought so..."
   1573             print "Child traceback:"
   1574             print e.child_traceback
   1575         else:
   1576             print "Error", e.errno
   1577     else:
   1578         print >>sys.stderr, "Gosh.  No error."
   1579 
   1580 
   1581 def _demo_windows():
   1582     #
   1583     # Example 1: Connecting several subprocesses
   1584     #
   1585     print "Looking for 'PROMPT' in set output..."
   1586     p1 = Popen("set", stdout=PIPE, shell=True)
   1587     p2 = Popen('find "PROMPT"', stdin=p1.stdout, stdout=PIPE)
   1588     print repr(p2.communicate()[0])
   1589 
   1590     #
   1591     # Example 2: Simple execution of program
   1592     #
   1593     print "Executing calc..."
   1594     p = Popen("calc")
   1595     p.wait()
   1596 
   1597 
   1598 if __name__ == "__main__":
   1599     if mswindows:
   1600         _demo_windows()
   1601     else:
   1602         _demo_posix()
   1603