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@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
12r"""subprocess - Subprocesses with accessible I/O streams
13
14This module allows you to spawn processes, connect to their
15input/output/error pipes, and obtain their return codes.  This module
16intends to replace several other, older modules and functions, like:
17
18os.system
19os.spawn*
20os.popen*
21popen2.*
22commands.*
23
24Information about how the subprocess module can be used to replace these
25modules and functions can be found below.
26
27
28
29Using the subprocess module
30===========================
31This module defines one class called Popen:
32
33class 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
40Arguments are:
41
42args should be a string, or a sequence of program arguments.  The
43program to execute is normally the first item in the args sequence or
44string, but can be explicitly set by using the executable argument.
45
46On UNIX, with shell=False (default): In this case, the Popen class
47uses os.execvp() to execute the child program.  args should normally
48be a sequence.  A string will be treated as a sequence with the string
49as the only item (the program to execute).
50
51On UNIX, with shell=True: If args is a string, it specifies the
52command string to execute through the shell.  If args is a sequence,
53the first item specifies the command string, and any additional items
54will be treated as additional shell arguments.
55
56On Windows: the Popen class uses CreateProcess() to execute the child
57program, which operates on strings.  If args is a sequence, it will be
58converted to a string using the list2cmdline method.  Please note that
59not all MS Windows applications interpret the command line the same
60way: The list2cmdline is designed for applications using the same
61rules as the MS C runtime.
62
63bufsize, if given, has the same meaning as the corresponding argument
64to the built-in open() function: 0 means unbuffered, 1 means line
65buffered, any other positive value means use a buffer of
66(approximately) that size.  A negative bufsize means to use the system
67default, which usually means fully buffered.  The default value for
68bufsize is 0 (unbuffered).
69
70stdin, stdout and stderr specify the executed programs' standard
71input, standard output and standard error file handles, respectively.
72Valid values are PIPE, an existing file descriptor (a positive
73integer), an existing file object, and None.  PIPE indicates that a
74new pipe to the child should be created.  With None, no redirection
75will occur; the child's file handles will be inherited from the
76parent.  Additionally, stderr can be STDOUT, which indicates that the
77stderr data from the applications should be captured into the same
78file handle as for stdout.
79
80If preexec_fn is set to a callable object, this object will be called
81in the child process just before the child is executed.
82
83If close_fds is true, all file descriptors except 0, 1 and 2 will be
84closed before the child process is executed.
85
86if shell is true, the specified command will be executed through the
87shell.
88
89If cwd is not None, the current directory will be changed to cwd
90before the child is executed.
91
92If env is not None, it defines the environment variables for the new
93process.
94
95If universal_newlines is true, the file objects stdout and stderr are
96opened as a text files, but lines may be terminated by any of '\n',
97the Unix end-of-line convention, '\r', the Macintosh convention or
98'\r\n', the Windows convention.  All of these external representations
99are seen as '\n' by the Python program.  Note: This feature is only
100available if Python is built with universal newline support (the
101default).  Also, the newlines attribute of the file objects stdout,
102stdin and stderr are not updated by the communicate() method.
103
104The startupinfo and creationflags, if given, will be passed to the
105underlying CreateProcess() function.  They can specify things such as
106appearance of the main window and priority for the new process.
107(Windows only)
108
109
110This module also defines some shortcut functions:
111
112call(*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
120check_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
130check_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
142Exceptions
143----------
144Exceptions raised in the child process, before the new program has
145started to execute, will be re-raised in the parent.  Additionally,
146the exception object will have one extra attribute called
147'child_traceback', which is a string containing traceback information
148from the childs point of view.
149
150The most common exception raised is OSError.  This occurs, for
151example, when trying to execute a non-existent file.  Applications
152should prepare for OSErrors.
153
154A ValueError will be raised if Popen is called with invalid arguments.
155
156check_call() and check_output() will raise CalledProcessError, if the
157called process returns a non-zero return code.
158
159
160Security
161--------
162Unlike some other popen functions, this implementation will never call
163/bin/sh implicitly.  This means that all characters, including shell
164metacharacters, can safely be passed to child processes.
165
166
167Popen objects
168=============
169Instances of the Popen class have the following methods:
170
171poll()
172    Check if child process has terminated.  Returns returncode
173    attribute.
174
175wait()
176    Wait for child process to terminate.  Returns returncode attribute.
177
178communicate(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
190The following attributes are also available:
191
192stdin
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
196stdout
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
201stderr
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
206pid
207    The process ID of the child process.
208
209returncode
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
215Replacing older functions with the subprocess module
216====================================================
217In this section, "a ==> b" means that b can be used as a replacement
218for a.
219
220Note: All functions in this section fail (more or less) silently if
221the executed program cannot be found; this module raises an OSError
222exception.
223
224In the following examples, we assume that the subprocess module is
225imported with "from subprocess import *".
226
227
228Replacing /bin/sh shell backquote
229---------------------------------
230output=`mycmd myarg`
231==>
232output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]
233
234
235Replacing shell pipe line
236-------------------------
237output=`dmesg | grep hda`
238==>
239p1 = Popen(["dmesg"], stdout=PIPE)
240p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
241output = p2.communicate()[0]
242
243
244Replacing os.system()
245---------------------
246sts = os.system("mycmd" + " myarg")
247==>
248p = Popen("mycmd" + " myarg", shell=True)
249pid, sts = os.waitpid(p.pid, 0)
250
251Note:
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
258A more real-world example would look like this:
259
260try:
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
266except OSError, e:
267    print >>sys.stderr, "Execution failed:", e
268
269
270Replacing os.spawn*
271-------------------
272P_NOWAIT example:
273
274pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")
275==>
276pid = Popen(["/bin/mycmd", "myarg"]).pid
277
278
279P_WAIT example:
280
281retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")
282==>
283retcode = call(["/bin/mycmd", "myarg"])
284
285
286Vector example:
287
288os.spawnvp(os.P_NOWAIT, path, args)
289==>
290Popen([path] + args[1:])
291
292
293Environment example:
294
295os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
296==>
297Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})
298
299
300Replacing os.popen*
301-------------------
302pipe = os.popen("cmd", mode='r', bufsize)
303==>
304pipe = Popen("cmd", shell=True, bufsize=bufsize, stdout=PIPE).stdout
305
306pipe = os.popen("cmd", mode='w', bufsize)
307==>
308pipe = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE).stdin
309
310
311(child_stdin, child_stdout) = os.popen2("cmd", mode, bufsize)
312==>
313p = 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==>
322p = 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==>
332p = 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
336On Unix, os.popen2, os.popen3 and os.popen4 also accept a sequence as
337the command to execute, in which case arguments will be passed
338directly to the program without shell intervention.  This usage can be
339replaced as follows:
340
341(child_stdin, child_stdout) = os.popen2(["/bin/ls", "-l"], mode,
342                                        bufsize)
343==>
344p = Popen(["/bin/ls", "-l"], bufsize=bufsize, stdin=PIPE, stdout=PIPE)
345(child_stdin, child_stdout) = (p.stdin, p.stdout)
346
347Return code handling translates as follows:
348
349pipe = os.popen("cmd", 'w')
350...
351rc = pipe.close()
352if rc is not None and rc % 256:
353    print "There were some errors"
354==>
355process = Popen("cmd", 'w', shell=True, stdin=PIPE)
356...
357process.stdin.close()
358if process.wait() != 0:
359    print "There were some errors"
360
361
362Replacing popen2.*
363------------------
364(child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)
365==>
366p = Popen(["somestring"], shell=True, bufsize=bufsize
367          stdin=PIPE, stdout=PIPE, close_fds=True)
368(child_stdout, child_stdin) = (p.stdout, p.stdin)
369
370On Unix, popen2 also accepts a sequence as the command to execute, in
371which case arguments will be passed directly to the program without
372shell intervention.  This usage can be replaced as follows:
373
374(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize,
375                                            mode)
376==>
377p = Popen(["mycmd", "myarg"], bufsize=bufsize,
378          stdin=PIPE, stdout=PIPE, close_fds=True)
379(child_stdout, child_stdin) = (p.stdout, p.stdin)
380
381The popen2.Popen3 and popen2.Popen4 basically works as subprocess.Popen,
382except 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
391import sys
392mswindows = (sys.platform == "win32")
393
394import os
395import types
396import traceback
397import gc
398import signal
399import errno
400
401# Exception classes used by this module.
402class 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
416if 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
428else:
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
443if 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"])
453try:
454    MAXFD = os.sysconf("SC_OPEN_MAX")
455except:
456    MAXFD = 256
457
458_active = []
459
460def _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
471PIPE = -1
472STDOUT = -2
473
474
475def _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
489def _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
516def 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
527def 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
546def 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
579def 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
649class 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
1540def _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
1581def _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
1598if __name__ == "__main__":
1599    if mswindows:
1600        _demo_windows()
1601    else:
1602        _demo_posix()
1603