d115e87cc61a3fc8b3d43c9d9ae2a3e93cee8e8a
[git.git] / compat / subprocess.py
1 # subprocess - Subprocesses with accessible I/O streams
2 #
3 # For more information about this module, see PEP 324.
4 #
5 # Copyright (c) 2003-2004 by Peter Astrand <astrand@lysator.liu.se>
6 #
7 # By obtaining, using, and/or copying this software and/or its
8 # associated documentation, you agree that you have read, understood,
9 # and will comply with the following terms and conditions:
10 #
11 # Permission to use, copy, modify, and distribute this software and
12 # its associated documentation for any purpose and without fee is
13 # hereby granted, provided that the above copyright notice appears in
14 # all copies, and that both that copyright notice and this permission
15 # notice appear in supporting documentation, and that the name of the
16 # author not be used in advertising or publicity pertaining to
17 # distribution of the software without specific, written prior
18 # permission.
19 #
20 # THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
21 # INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
22 # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR
23 # CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
24 # OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
25 # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
26 # WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
27
28 r"""subprocess - Subprocesses with accessible I/O streams
29
30 This module allows you to spawn processes, connect to their
31 input/output/error pipes, and obtain their return codes.  This module
32 intends to replace several other, older modules and functions, like:
33
34 os.system
35 os.spawn*
36 os.popen*
37 popen2.*
38 commands.*
39
40 Information about how the subprocess module can be used to replace these
41 modules and functions can be found below.
42
43
44
45 Using the subprocess module
46 ===========================
47 This module defines one class called Popen:
48
49 class Popen(args, bufsize=0, executable=None,
50             stdin=None, stdout=None, stderr=None,
51             preexec_fn=None, close_fds=False, shell=False,
52             cwd=None, env=None, universal_newlines=False,
53             startupinfo=None, creationflags=0):
54
55
56 Arguments are:
57
58 args should be a string, or a sequence of program arguments.  The
59 program to execute is normally the first item in the args sequence or
60 string, but can be explicitly set by using the executable argument.
61
62 On UNIX, with shell=False (default): In this case, the Popen class
63 uses os.execvp() to execute the child program.  args should normally
64 be a sequence.  A string will be treated as a sequence with the string
65 as the only item (the program to execute).
66
67 On UNIX, with shell=True: If args is a string, it specifies the
68 command string to execute through the shell.  If args is a sequence,
69 the first item specifies the command string, and any additional items
70 will be treated as additional shell arguments.
71
72 On Windows: the Popen class uses CreateProcess() to execute the child
73 program, which operates on strings.  If args is a sequence, it will be
74 converted to a string using the list2cmdline method.  Please note that
75 not all MS Windows applications interpret the command line the same
76 way: The list2cmdline is designed for applications using the same
77 rules as the MS C runtime.
78
79 bufsize, if given, has the same meaning as the corresponding argument
80 to the built-in open() function: 0 means unbuffered, 1 means line
81 buffered, any other positive value means use a buffer of
82 (approximately) that size.  A negative bufsize means to use the system
83 default, which usually means fully buffered.  The default value for
84 bufsize is 0 (unbuffered).
85
86 stdin, stdout and stderr specify the executed programs' standard
87 input, standard output and standard error file handles, respectively.
88 Valid values are PIPE, an existing file descriptor (a positive
89 integer), an existing file object, and None.  PIPE indicates that a
90 new pipe to the child should be created.  With None, no redirection
91 will occur; the child's file handles will be inherited from the
92 parent.  Additionally, stderr can be STDOUT, which indicates that the
93 stderr data from the applications should be captured into the same
94 file handle as for stdout.
95
96 If preexec_fn is set to a callable object, this object will be called
97 in the child process just before the child is executed.
98
99 If close_fds is true, all file descriptors except 0, 1 and 2 will be
100 closed before the child process is executed.
101
102 if shell is true, the specified command will be executed through the
103 shell.
104
105 If cwd is not None, the current directory will be changed to cwd
106 before the child is executed.
107
108 If env is not None, it defines the environment variables for the new
109 process.
110
111 If universal_newlines is true, the file objects stdout and stderr are
112 opened as a text files, but lines may be terminated by any of '\n',
113 the Unix end-of-line convention, '\r', the Macintosh convention or
114 '\r\n', the Windows convention.  All of these external representations
115 are seen as '\n' by the Python program.  Note: This feature is only
116 available if Python is built with universal newline support (the
117 default).  Also, the newlines attribute of the file objects stdout,
118 stdin and stderr are not updated by the communicate() method.
119
120 The startupinfo and creationflags, if given, will be passed to the
121 underlying CreateProcess() function.  They can specify things such as
122 appearance of the main window and priority for the new process.
123 (Windows only)
124
125
126 This module also defines two shortcut functions:
127
128 call(*args, **kwargs):
129     Run command with arguments.  Wait for command to complete, then
130     return the returncode attribute.
131
132     The arguments are the same as for the Popen constructor.  Example:
133
134     retcode = call(["ls", "-l"])
135
136
137 Exceptions
138 ----------
139 Exceptions raised in the child process, before the new program has
140 started to execute, will be re-raised in the parent.  Additionally,
141 the exception object will have one extra attribute called
142 'child_traceback', which is a string containing traceback information
143 from the childs point of view.
144
145 The most common exception raised is OSError.  This occurs, for
146 example, when trying to execute a non-existent file.  Applications
147 should prepare for OSErrors.
148
149 A ValueError will be raised if Popen is called with invalid arguments.
150
151
152 Security
153 --------
154 Unlike some other popen functions, this implementation will never call
155 /bin/sh implicitly.  This means that all characters, including shell
156 metacharacters, can safely be passed to child processes.
157
158
159 Popen objects
160 =============
161 Instances of the Popen class have the following methods:
162
163 poll()
164     Check if child process has terminated.  Returns returncode
165     attribute.
166
167 wait()
168     Wait for child process to terminate.  Returns returncode attribute.
169
170 communicate(input=None)
171     Interact with process: Send data to stdin.  Read data from stdout
172     and stderr, until end-of-file is reached.  Wait for process to
173     terminate.  The optional stdin argument should be a string to be
174     sent to the child process, or None, if no data should be sent to
175     the child.
176
177     communicate() returns a tuple (stdout, stderr).
178
179     Note: The data read is buffered in memory, so do not use this
180     method if the data size is large or unlimited.
181
182 The following attributes are also available:
183
184 stdin
185     If the stdin argument is PIPE, this attribute is a file object
186     that provides input to the child process.  Otherwise, it is None.
187
188 stdout
189     If the stdout argument is PIPE, this attribute is a file object
190     that provides output from the child process.  Otherwise, it is
191     None.
192
193 stderr
194     If the stderr argument is PIPE, this attribute is file object that
195     provides error output from the child process.  Otherwise, it is
196     None.
197
198 pid
199     The process ID of the child process.
200
201 returncode
202     The child return code.  A None value indicates that the process
203     hasn't terminated yet.  A negative value -N indicates that the
204     child was terminated by signal N (UNIX only).
205
206
207 Replacing older functions with the subprocess module
208 ====================================================
209 In this section, "a ==> b" means that b can be used as a replacement
210 for a.
211
212 Note: All functions in this section fail (more or less) silently if
213 the executed program cannot be found; this module raises an OSError
214 exception.
215
216 In the following examples, we assume that the subprocess module is
217 imported with "from subprocess import *".
218
219
220 Replacing /bin/sh shell backquote
221 ---------------------------------
222 output=`mycmd myarg`
223 ==>
224 output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]
225
226
227 Replacing shell pipe line
228 -------------------------
229 output=`dmesg | grep hda`
230 ==>
231 p1 = Popen(["dmesg"], stdout=PIPE)
232 p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
233 output = p2.communicate()[0]
234
235
236 Replacing os.system()
237 ---------------------
238 sts = os.system("mycmd" + " myarg")
239 ==>
240 p = Popen("mycmd" + " myarg", shell=True)
241 sts = os.waitpid(p.pid, 0)
242
243 Note:
244
245 * Calling the program through the shell is usually not required.
246
247 * It's easier to look at the returncode attribute than the
248   exitstatus.
249
250 A more real-world example would look like this:
251
252 try:
253     retcode = call("mycmd" + " myarg", shell=True)
254     if retcode < 0:
255         print >>sys.stderr, "Child was terminated by signal", -retcode
256     else:
257         print >>sys.stderr, "Child returned", retcode
258 except OSError, e:
259     print >>sys.stderr, "Execution failed:", e
260
261
262 Replacing os.spawn*
263 -------------------
264 P_NOWAIT example:
265
266 pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")
267 ==>
268 pid = Popen(["/bin/mycmd", "myarg"]).pid
269
270
271 P_WAIT example:
272
273 retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")
274 ==>
275 retcode = call(["/bin/mycmd", "myarg"])
276
277
278 Vector example:
279
280 os.spawnvp(os.P_NOWAIT, path, args)
281 ==>
282 Popen([path] + args[1:])
283
284
285 Environment example:
286
287 os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
288 ==>
289 Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})
290
291
292 Replacing os.popen*
293 -------------------
294 pipe = os.popen(cmd, mode='r', bufsize)
295 ==>
296 pipe = Popen(cmd, shell=True, bufsize=bufsize, stdout=PIPE).stdout
297
298 pipe = os.popen(cmd, mode='w', bufsize)
299 ==>
300 pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin
301
302
303 (child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize)
304 ==>
305 p = Popen(cmd, shell=True, bufsize=bufsize,
306           stdin=PIPE, stdout=PIPE, close_fds=True)
307 (child_stdin, child_stdout) = (p.stdin, p.stdout)
308
309
310 (child_stdin,
311  child_stdout,
312  child_stderr) = os.popen3(cmd, mode, bufsize)
313 ==>
314 p = Popen(cmd, shell=True, bufsize=bufsize,
315           stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
316 (child_stdin,
317  child_stdout,
318  child_stderr) = (p.stdin, p.stdout, p.stderr)
319
320
321 (child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize)
322 ==>
323 p = Popen(cmd, shell=True, bufsize=bufsize,
324           stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
325 (child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout)
326
327
328 Replacing popen2.*
329 ------------------
330 Note: If the cmd argument to popen2 functions is a string, the command
331 is executed through /bin/sh.  If it is a list, the command is directly
332 executed.
333
334 (child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)
335 ==>
336 p = Popen(["somestring"], shell=True, bufsize=bufsize
337           stdin=PIPE, stdout=PIPE, close_fds=True)
338 (child_stdout, child_stdin) = (p.stdout, p.stdin)
339
340
341 (child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode)
342 ==>
343 p = Popen(["mycmd", "myarg"], bufsize=bufsize,
344           stdin=PIPE, stdout=PIPE, close_fds=True)
345 (child_stdout, child_stdin) = (p.stdout, p.stdin)
346
347 The popen2.Popen3 and popen3.Popen4 basically works as subprocess.Popen,
348 except that:
349
350 * subprocess.Popen raises an exception if the execution fails
351 * the capturestderr argument is replaced with the stderr argument.
352 * stdin=PIPE and stdout=PIPE must be specified.
353 * popen2 closes all filedescriptors by default, but you have to specify
354   close_fds=True with subprocess.Popen.
355
356
357 """
358
359 import sys
360 mswindows = (sys.platform == "win32")
361
362 import os
363 import types
364 import traceback
365
366 if mswindows:
367     import threading
368     import msvcrt
369     if 0: # <-- change this to use pywin32 instead of the _subprocess driver
370         import pywintypes
371         from win32api import GetStdHandle, STD_INPUT_HANDLE, \
372                              STD_OUTPUT_HANDLE, STD_ERROR_HANDLE
373         from win32api import GetCurrentProcess, DuplicateHandle, \
374                              GetModuleFileName, GetVersion
375         from win32con import DUPLICATE_SAME_ACCESS, SW_HIDE
376         from win32pipe import CreatePipe
377         from win32process import CreateProcess, STARTUPINFO, \
378                                  GetExitCodeProcess, STARTF_USESTDHANDLES, \
379                                  STARTF_USESHOWWINDOW, CREATE_NEW_CONSOLE
380         from win32event import WaitForSingleObject, INFINITE, WAIT_OBJECT_0
381     else:
382         from _subprocess import *
383         class STARTUPINFO:
384             dwFlags = 0
385             hStdInput = None
386             hStdOutput = None
387             hStdError = None
388         class pywintypes:
389             error = IOError
390 else:
391     import select
392     import errno
393     import fcntl
394     import pickle
395
396 __all__ = ["Popen", "PIPE", "STDOUT", "call"]
397
398 try:
399     MAXFD = os.sysconf("SC_OPEN_MAX")
400 except:
401     MAXFD = 256
402
403 # True/False does not exist on 2.2.0
404 try:
405     False
406 except NameError:
407     False = 0
408     True = 1
409
410 _active = []
411
412 def _cleanup():
413     for inst in _active[:]:
414         inst.poll()
415
416 PIPE = -1
417 STDOUT = -2
418
419
420 def call(*args, **kwargs):
421     """Run command with arguments.  Wait for command to complete, then
422     return the returncode attribute.
423
424     The arguments are the same as for the Popen constructor.  Example:
425
426     retcode = call(["ls", "-l"])
427     """
428     return Popen(*args, **kwargs).wait()
429
430
431 def list2cmdline(seq):
432     """
433     Translate a sequence of arguments into a command line
434     string, using the same rules as the MS C runtime:
435
436     1) Arguments are delimited by white space, which is either a
437        space or a tab.
438
439     2) A string surrounded by double quotation marks is
440        interpreted as a single argument, regardless of white space
441        contained within.  A quoted string can be embedded in an
442        argument.
443
444     3) A double quotation mark preceded by a backslash is
445        interpreted as a literal double quotation mark.
446
447     4) Backslashes are interpreted literally, unless they
448        immediately precede a double quotation mark.
449
450     5) If backslashes immediately precede a double quotation mark,
451        every pair of backslashes is interpreted as a literal
452        backslash.  If the number of backslashes is odd, the last
453        backslash escapes the next double quotation mark as
454        described in rule 3.
455     """
456
457     # See
458     # http://msdn.microsoft.com/library/en-us/vccelng/htm/progs_12.asp
459     result = []
460     needquote = False
461     for arg in seq:
462         bs_buf = []
463
464         # Add a space to separate this argument from the others
465         if result:
466             result.append(' ')
467
468         needquote = (" " in arg) or ("\t" in arg)
469         if needquote:
470             result.append('"')
471
472         for c in arg:
473             if c == '\\':
474                 # Don't know if we need to double yet.
475                 bs_buf.append(c)
476             elif c == '"':
477                 # Double backspaces.
478                 result.append('\\' * len(bs_buf)*2)
479                 bs_buf = []
480                 result.append('\\"')
481             else:
482                 # Normal char
483                 if bs_buf:
484                     result.extend(bs_buf)
485                     bs_buf = []
486                 result.append(c)
487
488         # Add remaining backspaces, if any.
489         if bs_buf:
490             result.extend(bs_buf)
491
492         if needquote:
493             result.extend(bs_buf)
494             result.append('"')
495
496     return ''.join(result)
497
498
499 class Popen(object):
500     def __init__(self, args, bufsize=0, executable=None,
501                  stdin=None, stdout=None, stderr=None,
502                  preexec_fn=None, close_fds=False, shell=False,
503                  cwd=None, env=None, universal_newlines=False,
504                  startupinfo=None, creationflags=0):
505         """Create new Popen instance."""
506         _cleanup()
507
508         if not isinstance(bufsize, (int, long)):
509             raise TypeError("bufsize must be an integer")
510
511         if mswindows:
512             if preexec_fn is not None:
513                 raise ValueError("preexec_fn is not supported on Windows "
514                                  "platforms")
515             if close_fds:
516                 raise ValueError("close_fds is not supported on Windows "
517                                  "platforms")
518         else:
519             # POSIX
520             if startupinfo is not None:
521                 raise ValueError("startupinfo is only supported on Windows "
522                                  "platforms")
523             if creationflags != 0:
524                 raise ValueError("creationflags is only supported on Windows "
525                                  "platforms")
526
527         self.stdin = None
528         self.stdout = None
529         self.stderr = None
530         self.pid = None
531         self.returncode = None
532         self.universal_newlines = universal_newlines
533
534         # Input and output objects. The general principle is like
535         # this:
536         #
537         # Parent                   Child
538         # ------                   -----
539         # p2cwrite   ---stdin--->  p2cread
540         # c2pread    <--stdout---  c2pwrite
541         # errread    <--stderr---  errwrite
542         #
543         # On POSIX, the child objects are file descriptors.  On
544         # Windows, these are Windows file handles.  The parent objects
545         # are file descriptors on both platforms.  The parent objects
546         # are None when not using PIPEs. The child objects are None
547         # when not redirecting.
548
549         (p2cread, p2cwrite,
550          c2pread, c2pwrite,
551          errread, errwrite) = self._get_handles(stdin, stdout, stderr)
552
553         self._execute_child(args, executable, preexec_fn, close_fds,
554                             cwd, env, universal_newlines,
555                             startupinfo, creationflags, shell,
556                             p2cread, p2cwrite,
557                             c2pread, c2pwrite,
558                             errread, errwrite)
559
560         if p2cwrite:
561             self.stdin = os.fdopen(p2cwrite, 'wb', bufsize)
562         if c2pread:
563             if universal_newlines:
564                 self.stdout = os.fdopen(c2pread, 'rU', bufsize)
565             else:
566                 self.stdout = os.fdopen(c2pread, 'rb', bufsize)
567         if errread:
568             if universal_newlines:
569                 self.stderr = os.fdopen(errread, 'rU', bufsize)
570             else:
571                 self.stderr = os.fdopen(errread, 'rb', bufsize)
572
573         _active.append(self)
574
575
576     def _translate_newlines(self, data):
577         data = data.replace("\r\n", "\n")
578         data = data.replace("\r", "\n")
579         return data
580
581
582     if mswindows:
583         #
584         # Windows methods
585         #
586         def _get_handles(self, stdin, stdout, stderr):
587             """Construct and return tupel with IO objects:
588             p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
589             """
590             if stdin == None and stdout == None and stderr == None:
591                 return (None, None, None, None, None, None)
592
593             p2cread, p2cwrite = None, None
594             c2pread, c2pwrite = None, None
595             errread, errwrite = None, None
596
597             if stdin == None:
598                 p2cread = GetStdHandle(STD_INPUT_HANDLE)
599             elif stdin == PIPE:
600                 p2cread, p2cwrite = CreatePipe(None, 0)
601                 # Detach and turn into fd
602                 p2cwrite = p2cwrite.Detach()
603                 p2cwrite = msvcrt.open_osfhandle(p2cwrite, 0)
604             elif type(stdin) == types.IntType:
605                 p2cread = msvcrt.get_osfhandle(stdin)
606             else:
607                 # Assuming file-like object
608                 p2cread = msvcrt.get_osfhandle(stdin.fileno())
609             p2cread = self._make_inheritable(p2cread)
610
611             if stdout == None:
612                 c2pwrite = GetStdHandle(STD_OUTPUT_HANDLE)
613             elif stdout == PIPE:
614                 c2pread, c2pwrite = CreatePipe(None, 0)
615                 # Detach and turn into fd
616                 c2pread = c2pread.Detach()
617                 c2pread = msvcrt.open_osfhandle(c2pread, 0)
618             elif type(stdout) == types.IntType:
619                 c2pwrite = msvcrt.get_osfhandle(stdout)
620             else:
621                 # Assuming file-like object
622                 c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
623             c2pwrite = self._make_inheritable(c2pwrite)
624
625             if stderr == None:
626                 errwrite = GetStdHandle(STD_ERROR_HANDLE)
627             elif stderr == PIPE:
628                 errread, errwrite = CreatePipe(None, 0)
629                 # Detach and turn into fd
630                 errread = errread.Detach()
631                 errread = msvcrt.open_osfhandle(errread, 0)
632             elif stderr == STDOUT:
633                 errwrite = c2pwrite
634             elif type(stderr) == types.IntType:
635                 errwrite = msvcrt.get_osfhandle(stderr)
636             else:
637                 # Assuming file-like object
638                 errwrite = msvcrt.get_osfhandle(stderr.fileno())
639             errwrite = self._make_inheritable(errwrite)
640
641             return (p2cread, p2cwrite,
642                     c2pread, c2pwrite,
643                     errread, errwrite)
644
645
646         def _make_inheritable(self, handle):
647             """Return a duplicate of handle, which is inheritable"""
648             return DuplicateHandle(GetCurrentProcess(), handle,
649                                    GetCurrentProcess(), 0, 1,
650                                    DUPLICATE_SAME_ACCESS)
651
652
653         def _find_w9xpopen(self):
654             """Find and return absolut path to w9xpopen.exe"""
655             w9xpopen = os.path.join(os.path.dirname(GetModuleFileName(0)),
656                                     "w9xpopen.exe")
657             if not os.path.exists(w9xpopen):
658                 # Eeek - file-not-found - possibly an embedding
659                 # situation - see if we can locate it in sys.exec_prefix
660                 w9xpopen = os.path.join(os.path.dirname(sys.exec_prefix),
661                                         "w9xpopen.exe")
662                 if not os.path.exists(w9xpopen):
663                     raise RuntimeError("Cannot locate w9xpopen.exe, which is "
664                                        "needed for Popen to work with your "
665                                        "shell or platform.")
666             return w9xpopen
667
668
669         def _execute_child(self, args, executable, preexec_fn, close_fds,
670                            cwd, env, universal_newlines,
671                            startupinfo, creationflags, shell,
672                            p2cread, p2cwrite,
673                            c2pread, c2pwrite,
674                            errread, errwrite):
675             """Execute program (MS Windows version)"""
676
677             if not isinstance(args, types.StringTypes):
678                 args = list2cmdline(args)
679
680             # Process startup details
681             default_startupinfo = STARTUPINFO()
682             if startupinfo == None:
683                 startupinfo = default_startupinfo
684             if not None in (p2cread, c2pwrite, errwrite):
685                 startupinfo.dwFlags |= STARTF_USESTDHANDLES
686                 startupinfo.hStdInput = p2cread
687                 startupinfo.hStdOutput = c2pwrite
688                 startupinfo.hStdError = errwrite
689
690             if shell:
691                 default_startupinfo.dwFlags |= STARTF_USESHOWWINDOW
692                 default_startupinfo.wShowWindow = SW_HIDE
693                 comspec = os.environ.get("COMSPEC", "cmd.exe")
694                 args = comspec + " /c " + args
695                 if (GetVersion() >= 0x80000000L or
696                         os.path.basename(comspec).lower() == "command.com"):
697                     # Win9x, or using command.com on NT. We need to
698                     # use the w9xpopen intermediate program. For more
699                     # information, see KB Q150956
700                     # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp)
701                     w9xpopen = self._find_w9xpopen()
702                     args = '"%s" %s' % (w9xpopen, args)
703                     # Not passing CREATE_NEW_CONSOLE has been known to
704                     # cause random failures on win9x.  Specifically a
705                     # dialog: "Your program accessed mem currently in
706                     # use at xxx" and a hopeful warning about the
707                     # stability of your system.  Cost is Ctrl+C wont
708                     # kill children.
709                     creationflags |= CREATE_NEW_CONSOLE
710
711             # Start the process
712             try:
713                 hp, ht, pid, tid = CreateProcess(executable, args,
714                                          # no special security
715                                          None, None,
716                                          # must inherit handles to pass std
717                                          # handles
718                                          1,
719                                          creationflags,
720                                          env,
721                                          cwd,
722                                          startupinfo)
723             except pywintypes.error, e:
724                 # Translate pywintypes.error to WindowsError, which is
725                 # a subclass of OSError.  FIXME: We should really
726                 # translate errno using _sys_errlist (or simliar), but
727                 # how can this be done from Python?
728                 raise WindowsError(*e.args)
729
730             # Retain the process handle, but close the thread handle
731             self._handle = hp
732             self.pid = pid
733             ht.Close()
734
735             # Child is launched. Close the parent's copy of those pipe
736             # handles that only the child should have open.  You need
737             # to make sure that no handles to the write end of the
738             # output pipe are maintained in this process or else the
739             # pipe will not close when the child process exits and the
740             # ReadFile will hang.
741             if p2cread != None:
742                 p2cread.Close()
743             if c2pwrite != None:
744                 c2pwrite.Close()
745             if errwrite != None:
746                 errwrite.Close()
747
748
749         def poll(self):
750             """Check if child process has terminated.  Returns returncode
751             attribute."""
752             if self.returncode == None:
753                 if WaitForSingleObject(self._handle, 0) == WAIT_OBJECT_0:
754                     self.returncode = GetExitCodeProcess(self._handle)
755                     _active.remove(self)
756             return self.returncode
757
758
759         def wait(self):
760             """Wait for child process to terminate.  Returns returncode
761             attribute."""
762             if self.returncode == None:
763                 obj = WaitForSingleObject(self._handle, INFINITE)
764                 self.returncode = GetExitCodeProcess(self._handle)
765                 _active.remove(self)
766             return self.returncode
767
768
769         def _readerthread(self, fh, buffer):
770             buffer.append(fh.read())
771
772
773         def communicate(self, input=None):
774             """Interact with process: Send data to stdin.  Read data from
775             stdout and stderr, until end-of-file is reached.  Wait for
776             process to terminate.  The optional input argument should be a
777             string to be sent to the child process, or None, if no data
778             should be sent to the child.
779
780             communicate() returns a tuple (stdout, stderr)."""
781             stdout = None # Return
782             stderr = None # Return
783
784             if self.stdout:
785                 stdout = []
786                 stdout_thread = threading.Thread(target=self._readerthread,
787                                                  args=(self.stdout, stdout))
788                 stdout_thread.setDaemon(True)
789                 stdout_thread.start()
790             if self.stderr:
791                 stderr = []
792                 stderr_thread = threading.Thread(target=self._readerthread,
793                                                  args=(self.stderr, stderr))
794                 stderr_thread.setDaemon(True)
795                 stderr_thread.start()
796
797             if self.stdin:
798                 if input != None:
799                     self.stdin.write(input)
800                 self.stdin.close()
801
802             if self.stdout:
803                 stdout_thread.join()
804             if self.stderr:
805                 stderr_thread.join()
806
807             # All data exchanged.  Translate lists into strings.
808             if stdout != None:
809                 stdout = stdout[0]
810             if stderr != None:
811                 stderr = stderr[0]
812
813             # Translate newlines, if requested.  We cannot let the file
814             # object do the translation: It is based on stdio, which is
815             # impossible to combine with select (unless forcing no
816             # buffering).
817             if self.universal_newlines and hasattr(open, 'newlines'):
818                 if stdout:
819                     stdout = self._translate_newlines(stdout)
820                 if stderr:
821                     stderr = self._translate_newlines(stderr)
822
823             self.wait()
824             return (stdout, stderr)
825
826     else:
827         #
828         # POSIX methods
829         #
830         def _get_handles(self, stdin, stdout, stderr):
831             """Construct and return tupel with IO objects:
832             p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
833             """
834             p2cread, p2cwrite = None, None
835             c2pread, c2pwrite = None, None
836             errread, errwrite = None, None
837
838             if stdin == None:
839                 pass
840             elif stdin == PIPE:
841                 p2cread, p2cwrite = os.pipe()
842             elif type(stdin) == types.IntType:
843                 p2cread = stdin
844             else:
845                 # Assuming file-like object
846                 p2cread = stdin.fileno()
847
848             if stdout == None:
849                 pass
850             elif stdout == PIPE:
851                 c2pread, c2pwrite = os.pipe()
852             elif type(stdout) == types.IntType:
853                 c2pwrite = stdout
854             else:
855                 # Assuming file-like object
856                 c2pwrite = stdout.fileno()
857
858             if stderr == None:
859                 pass
860             elif stderr == PIPE:
861                 errread, errwrite = os.pipe()
862             elif stderr == STDOUT:
863                 errwrite = c2pwrite
864             elif type(stderr) == types.IntType:
865                 errwrite = stderr
866             else:
867                 # Assuming file-like object
868                 errwrite = stderr.fileno()
869
870             return (p2cread, p2cwrite,
871                     c2pread, c2pwrite,
872                     errread, errwrite)
873
874
875         def _set_cloexec_flag(self, fd):
876             try:
877                 cloexec_flag = fcntl.FD_CLOEXEC
878             except AttributeError:
879                 cloexec_flag = 1
880
881             old = fcntl.fcntl(fd, fcntl.F_GETFD)
882             fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag)
883
884
885         def _close_fds(self, but):
886             for i in range(3, MAXFD):
887                 if i == but:
888                     continue
889                 try:
890                     os.close(i)
891                 except:
892                     pass
893
894
895         def _execute_child(self, args, executable, preexec_fn, close_fds,
896                            cwd, env, universal_newlines,
897                            startupinfo, creationflags, shell,
898                            p2cread, p2cwrite,
899                            c2pread, c2pwrite,
900                            errread, errwrite):
901             """Execute program (POSIX version)"""
902
903             if isinstance(args, types.StringTypes):
904                 args = [args]
905
906             if shell:
907                 args = ["/bin/sh", "-c"] + args
908
909             if executable == None:
910                 executable = args[0]
911
912             # For transferring possible exec failure from child to parent
913             # The first char specifies the exception type: 0 means
914             # OSError, 1 means some other error.
915             errpipe_read, errpipe_write = os.pipe()
916             self._set_cloexec_flag(errpipe_write)
917
918             self.pid = os.fork()
919             if self.pid == 0:
920                 # Child
921                 try:
922                     # Close parent's pipe ends
923                     if p2cwrite:
924                         os.close(p2cwrite)
925                     if c2pread:
926                         os.close(c2pread)
927                     if errread:
928                         os.close(errread)
929                     os.close(errpipe_read)
930
931                     # Dup fds for child
932                     if p2cread:
933                         os.dup2(p2cread, 0)
934                     if c2pwrite:
935                         os.dup2(c2pwrite, 1)
936                     if errwrite:
937                         os.dup2(errwrite, 2)
938
939                     # Close pipe fds.  Make sure we doesn't close the same
940                     # fd more than once.
941                     if p2cread:
942                         os.close(p2cread)
943                     if c2pwrite and c2pwrite not in (p2cread,):
944                         os.close(c2pwrite)
945                     if errwrite and errwrite not in (p2cread, c2pwrite):
946                         os.close(errwrite)
947
948                     # Close all other fds, if asked for
949                     if close_fds:
950                         self._close_fds(but=errpipe_write)
951
952                     if cwd != None:
953                         os.chdir(cwd)
954
955                     if preexec_fn:
956                         apply(preexec_fn)
957
958                     if env == None:
959                         os.execvp(executable, args)
960                     else:
961                         os.execvpe(executable, args, env)
962
963                 except:
964                     exc_type, exc_value, tb = sys.exc_info()
965                     # Save the traceback and attach it to the exception object
966                     exc_lines = traceback.format_exception(exc_type,
967                                                            exc_value,
968                                                            tb)
969                     exc_value.child_traceback = ''.join(exc_lines)
970                     os.write(errpipe_write, pickle.dumps(exc_value))
971
972                 # This exitcode won't be reported to applications, so it
973                 # really doesn't matter what we return.
974                 os._exit(255)
975
976             # Parent
977             os.close(errpipe_write)
978             if p2cread and p2cwrite:
979                 os.close(p2cread)
980             if c2pwrite and c2pread:
981                 os.close(c2pwrite)
982             if errwrite and errread:
983                 os.close(errwrite)
984
985             # Wait for exec to fail or succeed; possibly raising exception
986             data = os.read(errpipe_read, 1048576) # Exceptions limited to 1 MB
987             os.close(errpipe_read)
988             if data != "":
989                 os.waitpid(self.pid, 0)
990                 child_exception = pickle.loads(data)
991                 raise child_exception
992
993
994         def _handle_exitstatus(self, sts):
995             if os.WIFSIGNALED(sts):
996                 self.returncode = -os.WTERMSIG(sts)
997             elif os.WIFEXITED(sts):
998                 self.returncode = os.WEXITSTATUS(sts)
999             else:
1000                 # Should never happen
1001                 raise RuntimeError("Unknown child exit status!")
1002
1003             _active.remove(self)
1004
1005
1006         def poll(self):
1007             """Check if child process has terminated.  Returns returncode
1008             attribute."""
1009             if self.returncode == None:
1010                 try:
1011                     pid, sts = os.waitpid(self.pid, os.WNOHANG)
1012                     if pid == self.pid:
1013                         self._handle_exitstatus(sts)
1014                 except os.error:
1015                     pass
1016             return self.returncode
1017
1018
1019         def wait(self):
1020             """Wait for child process to terminate.  Returns returncode
1021             attribute."""
1022             if self.returncode == None:
1023                 pid, sts = os.waitpid(self.pid, 0)
1024                 self._handle_exitstatus(sts)
1025             return self.returncode
1026
1027
1028         def communicate(self, input=None):
1029             """Interact with process: Send data to stdin.  Read data from
1030             stdout and stderr, until end-of-file is reached.  Wait for
1031             process to terminate.  The optional input argument should be a
1032             string to be sent to the child process, or None, if no data
1033             should be sent to the child.
1034
1035             communicate() returns a tuple (stdout, stderr)."""
1036             read_set = []
1037             write_set = []
1038             stdout = None # Return
1039             stderr = None # Return
1040
1041             if self.stdin:
1042                 # Flush stdio buffer.  This might block, if the user has
1043                 # been writing to .stdin in an uncontrolled fashion.
1044                 self.stdin.flush()
1045                 if input:
1046                     write_set.append(self.stdin)
1047                 else:
1048                     self.stdin.close()
1049             if self.stdout:
1050                 read_set.append(self.stdout)
1051                 stdout = []
1052             if self.stderr:
1053                 read_set.append(self.stderr)
1054                 stderr = []
1055
1056             while read_set or write_set:
1057                 rlist, wlist, xlist = select.select(read_set, write_set, [])
1058
1059                 if self.stdin in wlist:
1060                     # When select has indicated that the file is writable,
1061                     # we can write up to PIPE_BUF bytes without risk
1062                     # blocking.  POSIX defines PIPE_BUF >= 512
1063                     bytes_written = os.write(self.stdin.fileno(), input[:512])
1064                     input = input[bytes_written:]
1065                     if not input:
1066                         self.stdin.close()
1067                         write_set.remove(self.stdin)
1068
1069                 if self.stdout in rlist:
1070                     data = os.read(self.stdout.fileno(), 1024)
1071                     if data == "":
1072                         self.stdout.close()
1073                         read_set.remove(self.stdout)
1074                     stdout.append(data)
1075
1076                 if self.stderr in rlist:
1077                     data = os.read(self.stderr.fileno(), 1024)
1078                     if data == "":
1079                         self.stderr.close()
1080                         read_set.remove(self.stderr)
1081                     stderr.append(data)
1082
1083             # All data exchanged.  Translate lists into strings.
1084             if stdout != None:
1085                 stdout = ''.join(stdout)
1086             if stderr != None:
1087                 stderr = ''.join(stderr)
1088
1089             # Translate newlines, if requested.  We cannot let the file
1090             # object do the translation: It is based on stdio, which is
1091             # impossible to combine with select (unless forcing no
1092             # buffering).
1093             if self.universal_newlines and hasattr(open, 'newlines'):
1094                 if stdout:
1095                     stdout = self._translate_newlines(stdout)
1096                 if stderr:
1097                     stderr = self._translate_newlines(stderr)
1098
1099             self.wait()
1100             return (stdout, stderr)
1101
1102
1103 def _demo_posix():
1104     #
1105     # Example 1: Simple redirection: Get process list
1106     #
1107     plist = Popen(["ps"], stdout=PIPE).communicate()[0]
1108     print "Process list:"
1109     print plist
1110
1111     #
1112     # Example 2: Change uid before executing child
1113     #
1114     if os.getuid() == 0:
1115         p = Popen(["id"], preexec_fn=lambda: os.setuid(100))
1116         p.wait()
1117
1118     #
1119     # Example 3: Connecting several subprocesses
1120     #
1121     print "Looking for 'hda'..."
1122     p1 = Popen(["dmesg"], stdout=PIPE)
1123     p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
1124     print repr(p2.communicate()[0])
1125
1126     #
1127     # Example 4: Catch execution error
1128     #
1129     print
1130     print "Trying a weird file..."
1131     try:
1132         print Popen(["/this/path/does/not/exist"]).communicate()
1133     except OSError, e:
1134         if e.errno == errno.ENOENT:
1135             print "The file didn't exist.  I thought so..."
1136             print "Child traceback:"
1137             print e.child_traceback
1138         else:
1139             print "Error", e.errno
1140     else:
1141         print >>sys.stderr, "Gosh.  No error."
1142
1143
1144 def _demo_windows():
1145     #
1146     # Example 1: Connecting several subprocesses
1147     #
1148     print "Looking for 'PROMPT' in set output..."
1149     p1 = Popen("set", stdout=PIPE, shell=True)
1150     p2 = Popen('find "PROMPT"', stdin=p1.stdout, stdout=PIPE)
1151     print repr(p2.communicate()[0])
1152
1153     #
1154     # Example 2: Simple execution of program
1155     #
1156     print "Executing calc..."
1157     p = Popen("calc")
1158     p.wait()
1159
1160
1161 if __name__ == "__main__":
1162     if mswindows:
1163         _demo_windows()
1164     else:
1165         _demo_posix()