blob: 68ab05e4864747366ec38f3265717b387a238043 [file] [log] [blame]
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001# subprocess - Subprocesses with accessible I/O streams
2#
Tim Peterse718f612004-10-12 21:51:32 +00003# For more information about this module, see PEP 324.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00004#
Peter Astrandc26516b2005-02-21 08:13:02 +00005# This module should remain compatible with Python 2.2, see PEP 291.
6#
Peter Astrand3a708df2005-09-23 17:37:29 +00007# Copyright (c) 2003-2005 by Peter Astrand <astrand@lysator.liu.se>
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00008#
Peter Astrand69bf13f2005-02-14 08:56:32 +00009# Licensed to PSF under a Contributor Agreement.
Peter Astrand3a708df2005-09-23 17:37:29 +000010# See http://www.python.org/2.4/license for licensing details.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000011
Raymond Hettinger837dd932004-10-17 16:36:53 +000012r"""subprocess - Subprocesses with accessible I/O streams
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000013
Fredrik Lundh15aaacc2004-10-17 14:47:05 +000014This 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:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +000017
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 two shortcut functions:
111
Peter Astrand5f5e1412004-12-05 20:15:36 +0000112call(*popenargs, **kwargs):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000113 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
Peter Astrand454f7672005-01-01 09:36:35 +0000120check_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
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000124 return code in the returncode attribute.
Peter Astrand454f7672005-01-01 09:36:35 +0000125
126 The arguments are the same as for the Popen constructor. Example:
127
128 check_call(["ls", "-l"])
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000129
130Exceptions
131----------
132Exceptions raised in the child process, before the new program has
133started to execute, will be re-raised in the parent. Additionally,
134the exception object will have one extra attribute called
135'child_traceback', which is a string containing traceback information
136from the childs point of view.
137
138The most common exception raised is OSError. This occurs, for
139example, when trying to execute a non-existent file. Applications
140should prepare for OSErrors.
141
142A ValueError will be raised if Popen is called with invalid arguments.
143
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000144check_call() will raise CalledProcessError, if the called process
145returns a non-zero return code.
Peter Astrand454f7672005-01-01 09:36:35 +0000146
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000147
148Security
149--------
150Unlike some other popen functions, this implementation will never call
151/bin/sh implicitly. This means that all characters, including shell
152metacharacters, can safely be passed to child processes.
153
154
155Popen objects
156=============
157Instances of the Popen class have the following methods:
158
159poll()
160 Check if child process has terminated. Returns returncode
161 attribute.
162
163wait()
164 Wait for child process to terminate. Returns returncode attribute.
165
166communicate(input=None)
167 Interact with process: Send data to stdin. Read data from stdout
168 and stderr, until end-of-file is reached. Wait for process to
169 terminate. The optional stdin argument should be a string to be
170 sent to the child process, or None, if no data should be sent to
171 the child.
Tim Peterse718f612004-10-12 21:51:32 +0000172
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000173 communicate() returns a tuple (stdout, stderr).
174
175 Note: The data read is buffered in memory, so do not use this
176 method if the data size is large or unlimited.
177
178The following attributes are also available:
179
180stdin
181 If the stdin argument is PIPE, this attribute is a file object
182 that provides input to the child process. Otherwise, it is None.
183
184stdout
185 If the stdout argument is PIPE, this attribute is a file object
186 that provides output from the child process. Otherwise, it is
187 None.
188
189stderr
190 If the stderr argument is PIPE, this attribute is file object that
191 provides error output from the child process. Otherwise, it is
192 None.
193
194pid
195 The process ID of the child process.
196
197returncode
198 The child return code. A None value indicates that the process
199 hasn't terminated yet. A negative value -N indicates that the
200 child was terminated by signal N (UNIX only).
201
202
203Replacing older functions with the subprocess module
204====================================================
205In this section, "a ==> b" means that b can be used as a replacement
206for a.
207
208Note: All functions in this section fail (more or less) silently if
209the executed program cannot be found; this module raises an OSError
210exception.
211
212In the following examples, we assume that the subprocess module is
213imported with "from subprocess import *".
214
215
216Replacing /bin/sh shell backquote
217---------------------------------
218output=`mycmd myarg`
219==>
220output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]
221
222
223Replacing shell pipe line
224-------------------------
225output=`dmesg | grep hda`
226==>
227p1 = Popen(["dmesg"], stdout=PIPE)
Peter Astrand6fdf3cb2004-11-30 18:06:42 +0000228p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000229output = p2.communicate()[0]
230
231
232Replacing os.system()
233---------------------
234sts = os.system("mycmd" + " myarg")
235==>
236p = Popen("mycmd" + " myarg", shell=True)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000237pid, sts = os.waitpid(p.pid, 0)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000238
239Note:
240
241* Calling the program through the shell is usually not required.
242
243* It's easier to look at the returncode attribute than the
244 exitstatus.
245
246A more real-world example would look like this:
247
248try:
249 retcode = call("mycmd" + " myarg", shell=True)
250 if retcode < 0:
251 print >>sys.stderr, "Child was terminated by signal", -retcode
252 else:
253 print >>sys.stderr, "Child returned", retcode
254except OSError, e:
255 print >>sys.stderr, "Execution failed:", e
256
257
258Replacing os.spawn*
259-------------------
Tim Peterse718f612004-10-12 21:51:32 +0000260P_NOWAIT example:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000261
262pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")
263==>
264pid = Popen(["/bin/mycmd", "myarg"]).pid
265
266
267P_WAIT example:
268
269retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")
270==>
271retcode = call(["/bin/mycmd", "myarg"])
272
273
Tim Peterse718f612004-10-12 21:51:32 +0000274Vector example:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000275
276os.spawnvp(os.P_NOWAIT, path, args)
277==>
278Popen([path] + args[1:])
279
280
Tim Peterse718f612004-10-12 21:51:32 +0000281Environment example:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000282
283os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
284==>
285Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})
286
287
Tim Peterse718f612004-10-12 21:51:32 +0000288Replacing os.popen*
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000289-------------------
290pipe = os.popen(cmd, mode='r', bufsize)
291==>
292pipe = Popen(cmd, shell=True, bufsize=bufsize, stdout=PIPE).stdout
293
294pipe = os.popen(cmd, mode='w', bufsize)
295==>
296pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin
297
298
299(child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize)
300==>
301p = Popen(cmd, shell=True, bufsize=bufsize,
302 stdin=PIPE, stdout=PIPE, close_fds=True)
303(child_stdin, child_stdout) = (p.stdin, p.stdout)
304
305
306(child_stdin,
307 child_stdout,
308 child_stderr) = os.popen3(cmd, mode, bufsize)
309==>
310p = Popen(cmd, shell=True, bufsize=bufsize,
311 stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
312(child_stdin,
313 child_stdout,
314 child_stderr) = (p.stdin, p.stdout, p.stderr)
315
316
317(child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize)
318==>
319p = Popen(cmd, shell=True, bufsize=bufsize,
320 stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
321(child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout)
322
323
324Replacing popen2.*
325------------------
326Note: If the cmd argument to popen2 functions is a string, the command
327is executed through /bin/sh. If it is a list, the command is directly
328executed.
329
330(child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)
331==>
332p = Popen(["somestring"], shell=True, bufsize=bufsize
333 stdin=PIPE, stdout=PIPE, close_fds=True)
334(child_stdout, child_stdin) = (p.stdout, p.stdin)
335
336
337(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode)
338==>
339p = Popen(["mycmd", "myarg"], bufsize=bufsize,
340 stdin=PIPE, stdout=PIPE, close_fds=True)
341(child_stdout, child_stdin) = (p.stdout, p.stdin)
342
343The popen2.Popen3 and popen3.Popen4 basically works as subprocess.Popen,
344except that:
345
346* subprocess.Popen raises an exception if the execution fails
347* the capturestderr argument is replaced with the stderr argument.
348* stdin=PIPE and stdout=PIPE must be specified.
349* popen2 closes all filedescriptors by default, but you have to specify
Tim Peterse718f612004-10-12 21:51:32 +0000350 close_fds=True with subprocess.Popen.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000351
352
353"""
354
355import sys
356mswindows = (sys.platform == "win32")
357
358import os
Peter Astrandc26516b2005-02-21 08:13:02 +0000359import types
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000360import traceback
361
Peter Astrand454f7672005-01-01 09:36:35 +0000362# Exception classes used by this module.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000363class CalledProcessError(Exception):
Peter Astrand454f7672005-01-01 09:36:35 +0000364 """This exception is raised when a process run by check_call() returns
365 a non-zero exit status. The exit status will be stored in the
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000366 returncode attribute."""
367 def __init__(self, returncode, cmd):
368 self.returncode = returncode
369 self.cmd = cmd
370 def __str__(self):
371 return "Command '%s' returned non-zero exit status %d" % (self.cmd, self.returncode)
372
Peter Astrand454f7672005-01-01 09:36:35 +0000373
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000374if mswindows:
375 import threading
376 import msvcrt
Fredrik Lundh3e73a012004-10-13 18:19:18 +0000377 if 0: # <-- change this to use pywin32 instead of the _subprocess driver
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000378 import pywintypes
Tim Peterse8374a52004-10-13 03:15:00 +0000379 from win32api import GetStdHandle, STD_INPUT_HANDLE, \
380 STD_OUTPUT_HANDLE, STD_ERROR_HANDLE
381 from win32api import GetCurrentProcess, DuplicateHandle, \
382 GetModuleFileName, GetVersion
Peter Astrandc1d65362004-11-07 14:30:34 +0000383 from win32con import DUPLICATE_SAME_ACCESS, SW_HIDE
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000384 from win32pipe import CreatePipe
Tim Peterse8374a52004-10-13 03:15:00 +0000385 from win32process import CreateProcess, STARTUPINFO, \
386 GetExitCodeProcess, STARTF_USESTDHANDLES, \
Peter Astrandc1d65362004-11-07 14:30:34 +0000387 STARTF_USESHOWWINDOW, CREATE_NEW_CONSOLE
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000388 from win32event import WaitForSingleObject, INFINITE, WAIT_OBJECT_0
Fredrik Lundh3e73a012004-10-13 18:19:18 +0000389 else:
390 from _subprocess import *
391 class STARTUPINFO:
392 dwFlags = 0
393 hStdInput = None
394 hStdOutput = None
395 hStdError = None
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000396 wShowWindow = 0
Fredrik Lundh3e73a012004-10-13 18:19:18 +0000397 class pywintypes:
398 error = IOError
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000399else:
400 import select
401 import errno
402 import fcntl
403 import pickle
404
Peter Astrand454f7672005-01-01 09:36:35 +0000405__all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "CalledProcessError"]
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000406
407try:
408 MAXFD = os.sysconf("SC_OPEN_MAX")
409except:
410 MAXFD = 256
411
412# True/False does not exist on 2.2.0
413try:
414 False
415except NameError:
416 False = 0
417 True = 1
418
419_active = []
420
421def _cleanup():
422 for inst in _active[:]:
Guido van Rossumb5d47ef2006-08-24 02:27:45 +0000423 res = inst.poll(_deadstate=sys.maxint)
424 if res is not None and res >= 0:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000425 try:
426 _active.remove(inst)
427 except ValueError:
428 # This can happen if two threads create a new Popen instance.
429 # It's harmless that it was already removed, so ignore.
430 pass
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000431
432PIPE = -1
433STDOUT = -2
434
435
Peter Astrand5f5e1412004-12-05 20:15:36 +0000436def call(*popenargs, **kwargs):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000437 """Run command with arguments. Wait for command to complete, then
438 return the returncode attribute.
439
440 The arguments are the same as for the Popen constructor. Example:
441
442 retcode = call(["ls", "-l"])
443 """
Peter Astrand5f5e1412004-12-05 20:15:36 +0000444 return Popen(*popenargs, **kwargs).wait()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000445
446
Peter Astrand454f7672005-01-01 09:36:35 +0000447def check_call(*popenargs, **kwargs):
448 """Run command with arguments. Wait for command to complete. If
449 the exit code was zero then return, otherwise raise
450 CalledProcessError. The CalledProcessError object will have the
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000451 return code in the returncode attribute.
Peter Astrand454f7672005-01-01 09:36:35 +0000452
453 The arguments are the same as for the Popen constructor. Example:
454
455 check_call(["ls", "-l"])
456 """
457 retcode = call(*popenargs, **kwargs)
458 cmd = kwargs.get("args")
459 if cmd is None:
460 cmd = popenargs[0]
461 if retcode:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000462 raise CalledProcessError(retcode, cmd)
Peter Astrand454f7672005-01-01 09:36:35 +0000463 return retcode
464
465
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000466def list2cmdline(seq):
467 """
468 Translate a sequence of arguments into a command line
469 string, using the same rules as the MS C runtime:
470
471 1) Arguments are delimited by white space, which is either a
472 space or a tab.
473
474 2) A string surrounded by double quotation marks is
475 interpreted as a single argument, regardless of white space
476 contained within. A quoted string can be embedded in an
477 argument.
478
479 3) A double quotation mark preceded by a backslash is
480 interpreted as a literal double quotation mark.
481
482 4) Backslashes are interpreted literally, unless they
483 immediately precede a double quotation mark.
484
485 5) If backslashes immediately precede a double quotation mark,
486 every pair of backslashes is interpreted as a literal
487 backslash. If the number of backslashes is odd, the last
488 backslash escapes the next double quotation mark as
489 described in rule 3.
490 """
491
492 # See
493 # http://msdn.microsoft.com/library/en-us/vccelng/htm/progs_12.asp
494 result = []
495 needquote = False
496 for arg in seq:
497 bs_buf = []
498
499 # Add a space to separate this argument from the others
500 if result:
501 result.append(' ')
502
503 needquote = (" " in arg) or ("\t" in arg)
504 if needquote:
505 result.append('"')
506
507 for c in arg:
508 if c == '\\':
Tim Peterse718f612004-10-12 21:51:32 +0000509 # Don't know if we need to double yet.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000510 bs_buf.append(c)
511 elif c == '"':
Tim Peterse718f612004-10-12 21:51:32 +0000512 # Double backspaces.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000513 result.append('\\' * len(bs_buf)*2)
514 bs_buf = []
515 result.append('\\"')
516 else:
517 # Normal char
518 if bs_buf:
519 result.extend(bs_buf)
520 bs_buf = []
521 result.append(c)
522
Tim Peterse718f612004-10-12 21:51:32 +0000523 # Add remaining backspaces, if any.
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000524 if bs_buf:
525 result.extend(bs_buf)
526
527 if needquote:
Peter Astrand7e78ade2005-03-03 21:10:23 +0000528 result.extend(bs_buf)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000529 result.append('"')
530
531 return ''.join(result)
532
533
534class Popen(object):
535 def __init__(self, args, bufsize=0, executable=None,
536 stdin=None, stdout=None, stderr=None,
537 preexec_fn=None, close_fds=False, shell=False,
538 cwd=None, env=None, universal_newlines=False,
539 startupinfo=None, creationflags=0):
540 """Create new Popen instance."""
541 _cleanup()
542
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000543 self._child_created = False
Peter Astrand738131d2004-11-30 21:04:45 +0000544 if not isinstance(bufsize, (int, long)):
545 raise TypeError("bufsize must be an integer")
546
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000547 if mswindows:
Tim Peterse8374a52004-10-13 03:15:00 +0000548 if preexec_fn is not None:
549 raise ValueError("preexec_fn is not supported on Windows "
550 "platforms")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000551 if close_fds:
Tim Peterse8374a52004-10-13 03:15:00 +0000552 raise ValueError("close_fds is not supported on Windows "
553 "platforms")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000554 else:
555 # POSIX
Tim Peterse8374a52004-10-13 03:15:00 +0000556 if startupinfo is not None:
557 raise ValueError("startupinfo is only supported on Windows "
558 "platforms")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000559 if creationflags != 0:
Tim Peterse8374a52004-10-13 03:15:00 +0000560 raise ValueError("creationflags is only supported on Windows "
561 "platforms")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000562
Tim Peterse718f612004-10-12 21:51:32 +0000563 self.stdin = None
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000564 self.stdout = None
565 self.stderr = None
566 self.pid = None
567 self.returncode = None
568 self.universal_newlines = universal_newlines
569
570 # Input and output objects. The general principle is like
571 # this:
572 #
573 # Parent Child
574 # ------ -----
575 # p2cwrite ---stdin---> p2cread
576 # c2pread <--stdout--- c2pwrite
577 # errread <--stderr--- errwrite
578 #
579 # On POSIX, the child objects are file descriptors. On
580 # Windows, these are Windows file handles. The parent objects
581 # are file descriptors on both platforms. The parent objects
582 # are None when not using PIPEs. The child objects are None
583 # when not redirecting.
Tim Peterse718f612004-10-12 21:51:32 +0000584
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000585 (p2cread, p2cwrite,
586 c2pread, c2pwrite,
587 errread, errwrite) = self._get_handles(stdin, stdout, stderr)
588
589 self._execute_child(args, executable, preexec_fn, close_fds,
590 cwd, env, universal_newlines,
591 startupinfo, creationflags, shell,
592 p2cread, p2cwrite,
593 c2pread, c2pwrite,
594 errread, errwrite)
595
596 if p2cwrite:
597 self.stdin = os.fdopen(p2cwrite, 'wb', bufsize)
598 if c2pread:
599 if universal_newlines:
600 self.stdout = os.fdopen(c2pread, 'rU', bufsize)
601 else:
602 self.stdout = os.fdopen(c2pread, 'rb', bufsize)
603 if errread:
604 if universal_newlines:
605 self.stderr = os.fdopen(errread, 'rU', bufsize)
606 else:
607 self.stderr = os.fdopen(errread, 'rb', bufsize)
Tim Peterse718f612004-10-12 21:51:32 +0000608
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000609
610 def _translate_newlines(self, data):
611 data = data.replace("\r\n", "\n")
612 data = data.replace("\r", "\n")
613 return data
614
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000615
616 def __del__(self):
617 if not self._child_created:
618 # We didn't get to successfully create a child process.
619 return
620 # In case the child hasn't been waited on, check if it's done.
621 self.poll(_deadstate=sys.maxint)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000622 if self.returncode is None and _active is not None:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000623 # Child is still running, keep us alive until we can wait on it.
624 _active.append(self)
625
626
Peter Astrand23109f02005-03-03 20:28:59 +0000627 def communicate(self, input=None):
628 """Interact with process: Send data to stdin. Read data from
629 stdout and stderr, until end-of-file is reached. Wait for
630 process to terminate. The optional input argument should be a
631 string to be sent to the child process, or None, if no data
632 should be sent to the child.
Tim Peterseba28be2005-03-28 01:08:02 +0000633
Peter Astrand23109f02005-03-03 20:28:59 +0000634 communicate() returns a tuple (stdout, stderr)."""
635
636 # Optimization: If we are only using one pipe, or no pipe at
637 # all, using select() or threads is unnecessary.
638 if [self.stdin, self.stdout, self.stderr].count(None) >= 2:
Tim Peterseba28be2005-03-28 01:08:02 +0000639 stdout = None
640 stderr = None
Peter Astrand23109f02005-03-03 20:28:59 +0000641 if self.stdin:
642 if input:
643 self.stdin.write(input)
644 self.stdin.close()
645 elif self.stdout:
646 stdout = self.stdout.read()
647 elif self.stderr:
648 stderr = self.stderr.read()
649 self.wait()
650 return (stdout, stderr)
Tim Peterseba28be2005-03-28 01:08:02 +0000651
Peter Astrand23109f02005-03-03 20:28:59 +0000652 return self._communicate(input)
653
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000654
655 if mswindows:
656 #
657 # Windows methods
658 #
659 def _get_handles(self, stdin, stdout, stderr):
660 """Construct and return tupel with IO objects:
661 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
662 """
Peter Astrandd38ddf42005-02-10 08:32:50 +0000663 if stdin is None and stdout is None and stderr is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000664 return (None, None, None, None, None, None)
Tim Peterse718f612004-10-12 21:51:32 +0000665
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000666 p2cread, p2cwrite = None, None
667 c2pread, c2pwrite = None, None
668 errread, errwrite = None, None
669
Peter Astrandd38ddf42005-02-10 08:32:50 +0000670 if stdin is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000671 p2cread = GetStdHandle(STD_INPUT_HANDLE)
672 elif stdin == PIPE:
673 p2cread, p2cwrite = CreatePipe(None, 0)
674 # Detach and turn into fd
675 p2cwrite = p2cwrite.Detach()
676 p2cwrite = msvcrt.open_osfhandle(p2cwrite, 0)
Peter Astrandd38ddf42005-02-10 08:32:50 +0000677 elif isinstance(stdin, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000678 p2cread = msvcrt.get_osfhandle(stdin)
679 else:
680 # Assuming file-like object
681 p2cread = msvcrt.get_osfhandle(stdin.fileno())
682 p2cread = self._make_inheritable(p2cread)
683
Peter Astrandd38ddf42005-02-10 08:32:50 +0000684 if stdout is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000685 c2pwrite = GetStdHandle(STD_OUTPUT_HANDLE)
686 elif stdout == PIPE:
687 c2pread, c2pwrite = CreatePipe(None, 0)
688 # Detach and turn into fd
689 c2pread = c2pread.Detach()
690 c2pread = msvcrt.open_osfhandle(c2pread, 0)
Peter Astrandd38ddf42005-02-10 08:32:50 +0000691 elif isinstance(stdout, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000692 c2pwrite = msvcrt.get_osfhandle(stdout)
693 else:
694 # Assuming file-like object
695 c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
696 c2pwrite = self._make_inheritable(c2pwrite)
697
Peter Astrandd38ddf42005-02-10 08:32:50 +0000698 if stderr is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000699 errwrite = GetStdHandle(STD_ERROR_HANDLE)
700 elif stderr == PIPE:
701 errread, errwrite = CreatePipe(None, 0)
702 # Detach and turn into fd
703 errread = errread.Detach()
704 errread = msvcrt.open_osfhandle(errread, 0)
705 elif stderr == STDOUT:
706 errwrite = c2pwrite
Peter Astrandd38ddf42005-02-10 08:32:50 +0000707 elif isinstance(stderr, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000708 errwrite = msvcrt.get_osfhandle(stderr)
709 else:
710 # Assuming file-like object
711 errwrite = msvcrt.get_osfhandle(stderr.fileno())
712 errwrite = self._make_inheritable(errwrite)
713
714 return (p2cread, p2cwrite,
715 c2pread, c2pwrite,
716 errread, errwrite)
717
718
719 def _make_inheritable(self, handle):
720 """Return a duplicate of handle, which is inheritable"""
721 return DuplicateHandle(GetCurrentProcess(), handle,
722 GetCurrentProcess(), 0, 1,
723 DUPLICATE_SAME_ACCESS)
724
725
726 def _find_w9xpopen(self):
727 """Find and return absolut path to w9xpopen.exe"""
Tim Peterse8374a52004-10-13 03:15:00 +0000728 w9xpopen = os.path.join(os.path.dirname(GetModuleFileName(0)),
729 "w9xpopen.exe")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000730 if not os.path.exists(w9xpopen):
731 # Eeek - file-not-found - possibly an embedding
732 # situation - see if we can locate it in sys.exec_prefix
Tim Peterse8374a52004-10-13 03:15:00 +0000733 w9xpopen = os.path.join(os.path.dirname(sys.exec_prefix),
734 "w9xpopen.exe")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000735 if not os.path.exists(w9xpopen):
Tim Peterse8374a52004-10-13 03:15:00 +0000736 raise RuntimeError("Cannot locate w9xpopen.exe, which is "
737 "needed for Popen to work with your "
738 "shell or platform.")
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000739 return w9xpopen
740
Tim Peterse718f612004-10-12 21:51:32 +0000741
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000742 def _execute_child(self, args, executable, preexec_fn, close_fds,
743 cwd, env, universal_newlines,
744 startupinfo, creationflags, shell,
745 p2cread, p2cwrite,
746 c2pread, c2pwrite,
747 errread, errwrite):
748 """Execute program (MS Windows version)"""
749
Peter Astrandc26516b2005-02-21 08:13:02 +0000750 if not isinstance(args, types.StringTypes):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000751 args = list2cmdline(args)
752
Peter Astrandc1d65362004-11-07 14:30:34 +0000753 # Process startup details
Peter Astrandd38ddf42005-02-10 08:32:50 +0000754 if startupinfo is None:
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000755 startupinfo = STARTUPINFO()
756 if None not in (p2cread, c2pwrite, errwrite):
Peter Astrandc1d65362004-11-07 14:30:34 +0000757 startupinfo.dwFlags |= STARTF_USESTDHANDLES
758 startupinfo.hStdInput = p2cread
759 startupinfo.hStdOutput = c2pwrite
760 startupinfo.hStdError = errwrite
761
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000762 if shell:
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000763 startupinfo.dwFlags |= STARTF_USESHOWWINDOW
764 startupinfo.wShowWindow = SW_HIDE
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000765 comspec = os.environ.get("COMSPEC", "cmd.exe")
766 args = comspec + " /c " + args
Tim Peterse8374a52004-10-13 03:15:00 +0000767 if (GetVersion() >= 0x80000000L or
768 os.path.basename(comspec).lower() == "command.com"):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000769 # Win9x, or using command.com on NT. We need to
770 # use the w9xpopen intermediate program. For more
771 # information, see KB Q150956
772 # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp)
773 w9xpopen = self._find_w9xpopen()
774 args = '"%s" %s' % (w9xpopen, args)
775 # Not passing CREATE_NEW_CONSOLE has been known to
776 # cause random failures on win9x. Specifically a
777 # dialog: "Your program accessed mem currently in
778 # use at xxx" and a hopeful warning about the
779 # stability of your system. Cost is Ctrl+C wont
780 # kill children.
781 creationflags |= CREATE_NEW_CONSOLE
782
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000783 # Start the process
784 try:
785 hp, ht, pid, tid = CreateProcess(executable, args,
Tim Peterse8374a52004-10-13 03:15:00 +0000786 # no special security
787 None, None,
788 # must inherit handles to pass std
789 # handles
790 1,
791 creationflags,
792 env,
793 cwd,
794 startupinfo)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000795 except pywintypes.error, e:
796 # Translate pywintypes.error to WindowsError, which is
797 # a subclass of OSError. FIXME: We should really
798 # translate errno using _sys_errlist (or simliar), but
799 # how can this be done from Python?
800 raise WindowsError(*e.args)
801
802 # Retain the process handle, but close the thread handle
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000803 self._child_created = True
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000804 self._handle = hp
805 self.pid = pid
806 ht.Close()
807
Andrew M. Kuchling51ee66e2004-10-12 16:38:42 +0000808 # Child is launched. Close the parent's copy of those pipe
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000809 # handles that only the child should have open. You need
810 # to make sure that no handles to the write end of the
811 # output pipe are maintained in this process or else the
812 # pipe will not close when the child process exits and the
813 # ReadFile will hang.
Peter Astrandd38ddf42005-02-10 08:32:50 +0000814 if p2cread is not None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000815 p2cread.Close()
Peter Astrandd38ddf42005-02-10 08:32:50 +0000816 if c2pwrite is not None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000817 c2pwrite.Close()
Peter Astrandd38ddf42005-02-10 08:32:50 +0000818 if errwrite is not None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000819 errwrite.Close()
820
Tim Peterse718f612004-10-12 21:51:32 +0000821
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000822 def poll(self, _deadstate=None):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000823 """Check if child process has terminated. Returns returncode
824 attribute."""
Peter Astrandd38ddf42005-02-10 08:32:50 +0000825 if self.returncode is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000826 if WaitForSingleObject(self._handle, 0) == WAIT_OBJECT_0:
827 self.returncode = GetExitCodeProcess(self._handle)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000828 return self.returncode
829
830
831 def wait(self):
832 """Wait for child process to terminate. Returns returncode
833 attribute."""
Peter Astrandd38ddf42005-02-10 08:32:50 +0000834 if self.returncode is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000835 obj = WaitForSingleObject(self._handle, INFINITE)
836 self.returncode = GetExitCodeProcess(self._handle)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000837 return self.returncode
838
839
840 def _readerthread(self, fh, buffer):
841 buffer.append(fh.read())
842
843
Peter Astrand23109f02005-03-03 20:28:59 +0000844 def _communicate(self, input):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000845 stdout = None # Return
846 stderr = None # Return
847
848 if self.stdout:
849 stdout = []
Tim Peterse8374a52004-10-13 03:15:00 +0000850 stdout_thread = threading.Thread(target=self._readerthread,
851 args=(self.stdout, stdout))
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000852 stdout_thread.setDaemon(True)
853 stdout_thread.start()
854 if self.stderr:
855 stderr = []
Tim Peterse8374a52004-10-13 03:15:00 +0000856 stderr_thread = threading.Thread(target=self._readerthread,
857 args=(self.stderr, stderr))
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000858 stderr_thread.setDaemon(True)
859 stderr_thread.start()
860
861 if self.stdin:
Peter Astrandd38ddf42005-02-10 08:32:50 +0000862 if input is not None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000863 self.stdin.write(input)
864 self.stdin.close()
865
866 if self.stdout:
867 stdout_thread.join()
868 if self.stderr:
869 stderr_thread.join()
870
871 # All data exchanged. Translate lists into strings.
Peter Astrandd38ddf42005-02-10 08:32:50 +0000872 if stdout is not None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000873 stdout = stdout[0]
Peter Astrandd38ddf42005-02-10 08:32:50 +0000874 if stderr is not None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000875 stderr = stderr[0]
876
877 # Translate newlines, if requested. We cannot let the file
878 # object do the translation: It is based on stdio, which is
879 # impossible to combine with select (unless forcing no
880 # buffering).
Thomas Wouters477c8d52006-05-27 19:21:47 +0000881 if self.universal_newlines and hasattr(file, 'newlines'):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000882 if stdout:
883 stdout = self._translate_newlines(stdout)
884 if stderr:
885 stderr = self._translate_newlines(stderr)
886
887 self.wait()
888 return (stdout, stderr)
889
890 else:
891 #
892 # POSIX methods
893 #
894 def _get_handles(self, stdin, stdout, stderr):
895 """Construct and return tupel with IO objects:
896 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
897 """
898 p2cread, p2cwrite = None, None
899 c2pread, c2pwrite = None, None
900 errread, errwrite = None, None
901
Peter Astrandd38ddf42005-02-10 08:32:50 +0000902 if stdin is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000903 pass
904 elif stdin == PIPE:
905 p2cread, p2cwrite = os.pipe()
Peter Astrandd38ddf42005-02-10 08:32:50 +0000906 elif isinstance(stdin, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000907 p2cread = stdin
908 else:
909 # Assuming file-like object
910 p2cread = stdin.fileno()
911
Peter Astrandd38ddf42005-02-10 08:32:50 +0000912 if stdout is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000913 pass
914 elif stdout == PIPE:
915 c2pread, c2pwrite = os.pipe()
Peter Astrandd38ddf42005-02-10 08:32:50 +0000916 elif isinstance(stdout, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000917 c2pwrite = stdout
918 else:
919 # Assuming file-like object
Tim Peterse718f612004-10-12 21:51:32 +0000920 c2pwrite = stdout.fileno()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000921
Peter Astrandd38ddf42005-02-10 08:32:50 +0000922 if stderr is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000923 pass
924 elif stderr == PIPE:
925 errread, errwrite = os.pipe()
926 elif stderr == STDOUT:
927 errwrite = c2pwrite
Peter Astrandd38ddf42005-02-10 08:32:50 +0000928 elif isinstance(stderr, int):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000929 errwrite = stderr
930 else:
931 # Assuming file-like object
932 errwrite = stderr.fileno()
933
934 return (p2cread, p2cwrite,
935 c2pread, c2pwrite,
936 errread, errwrite)
937
938
939 def _set_cloexec_flag(self, fd):
940 try:
941 cloexec_flag = fcntl.FD_CLOEXEC
942 except AttributeError:
943 cloexec_flag = 1
944
945 old = fcntl.fcntl(fd, fcntl.F_GETFD)
946 fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag)
947
948
949 def _close_fds(self, but):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000950 for i in xrange(3, MAXFD):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000951 if i == but:
952 continue
953 try:
954 os.close(i)
955 except:
956 pass
Tim Peterse718f612004-10-12 21:51:32 +0000957
958
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000959 def _execute_child(self, args, executable, preexec_fn, close_fds,
960 cwd, env, universal_newlines,
961 startupinfo, creationflags, shell,
962 p2cread, p2cwrite,
963 c2pread, c2pwrite,
964 errread, errwrite):
965 """Execute program (POSIX version)"""
966
Peter Astrandc26516b2005-02-21 08:13:02 +0000967 if isinstance(args, types.StringTypes):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000968 args = [args]
Thomas Wouters89f507f2006-12-13 04:49:30 +0000969 else:
970 args = list(args)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000971
972 if shell:
973 args = ["/bin/sh", "-c"] + args
974
Peter Astrandd38ddf42005-02-10 08:32:50 +0000975 if executable is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000976 executable = args[0]
977
978 # For transferring possible exec failure from child to parent
979 # The first char specifies the exception type: 0 means
980 # OSError, 1 means some other error.
981 errpipe_read, errpipe_write = os.pipe()
982 self._set_cloexec_flag(errpipe_write)
983
984 self.pid = os.fork()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000985 self._child_created = True
Fredrik Lundh5b3687d2004-10-12 15:26:28 +0000986 if self.pid == 0:
987 # Child
988 try:
989 # Close parent's pipe ends
990 if p2cwrite:
991 os.close(p2cwrite)
992 if c2pread:
993 os.close(c2pread)
994 if errread:
995 os.close(errread)
996 os.close(errpipe_read)
997
998 # Dup fds for child
999 if p2cread:
1000 os.dup2(p2cread, 0)
1001 if c2pwrite:
1002 os.dup2(c2pwrite, 1)
1003 if errwrite:
1004 os.dup2(errwrite, 2)
1005
Thomas Wouters89f507f2006-12-13 04:49:30 +00001006 # Close pipe fds. Make sure we don't close the same
1007 # fd more than once, or standard fds.
1008 for fd in set((p2cread, c2pwrite, errwrite))-set((0,1,2)):
1009 if fd: os.close(fd)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001010
1011 # Close all other fds, if asked for
1012 if close_fds:
1013 self._close_fds(but=errpipe_write)
1014
Peter Astrandd38ddf42005-02-10 08:32:50 +00001015 if cwd is not None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001016 os.chdir(cwd)
1017
1018 if preexec_fn:
Neal Norwitzd9108552006-03-17 08:00:19 +00001019 preexec_fn()
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001020
Peter Astrandd38ddf42005-02-10 08:32:50 +00001021 if env is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001022 os.execvp(executable, args)
1023 else:
1024 os.execvpe(executable, args, env)
1025
1026 except:
1027 exc_type, exc_value, tb = sys.exc_info()
1028 # Save the traceback and attach it to the exception object
Tim Peterse8374a52004-10-13 03:15:00 +00001029 exc_lines = traceback.format_exception(exc_type,
1030 exc_value,
1031 tb)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001032 exc_value.child_traceback = ''.join(exc_lines)
1033 os.write(errpipe_write, pickle.dumps(exc_value))
1034
1035 # This exitcode won't be reported to applications, so it
1036 # really doesn't matter what we return.
1037 os._exit(255)
1038
1039 # Parent
1040 os.close(errpipe_write)
1041 if p2cread and p2cwrite:
1042 os.close(p2cread)
1043 if c2pwrite and c2pread:
1044 os.close(c2pwrite)
1045 if errwrite and errread:
1046 os.close(errwrite)
1047
1048 # Wait for exec to fail or succeed; possibly raising exception
1049 data = os.read(errpipe_read, 1048576) # Exceptions limited to 1 MB
1050 os.close(errpipe_read)
1051 if data != "":
Peter Astrandf791d7a2005-01-01 09:38:57 +00001052 os.waitpid(self.pid, 0)
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001053 child_exception = pickle.loads(data)
1054 raise child_exception
1055
1056
1057 def _handle_exitstatus(self, sts):
1058 if os.WIFSIGNALED(sts):
1059 self.returncode = -os.WTERMSIG(sts)
1060 elif os.WIFEXITED(sts):
1061 self.returncode = os.WEXITSTATUS(sts)
1062 else:
1063 # Should never happen
1064 raise RuntimeError("Unknown child exit status!")
1065
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001066
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001067 def poll(self, _deadstate=None):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001068 """Check if child process has terminated. Returns returncode
1069 attribute."""
Peter Astrandd38ddf42005-02-10 08:32:50 +00001070 if self.returncode is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001071 try:
1072 pid, sts = os.waitpid(self.pid, os.WNOHANG)
1073 if pid == self.pid:
1074 self._handle_exitstatus(sts)
1075 except os.error:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001076 if _deadstate is not None:
1077 self.returncode = _deadstate
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001078 return self.returncode
1079
1080
1081 def wait(self):
1082 """Wait for child process to terminate. Returns returncode
1083 attribute."""
Peter Astrandd38ddf42005-02-10 08:32:50 +00001084 if self.returncode is None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001085 pid, sts = os.waitpid(self.pid, 0)
1086 self._handle_exitstatus(sts)
1087 return self.returncode
1088
1089
Peter Astrand23109f02005-03-03 20:28:59 +00001090 def _communicate(self, input):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001091 read_set = []
1092 write_set = []
1093 stdout = None # Return
1094 stderr = None # Return
1095
1096 if self.stdin:
1097 # Flush stdio buffer. This might block, if the user has
1098 # been writing to .stdin in an uncontrolled fashion.
1099 self.stdin.flush()
1100 if input:
1101 write_set.append(self.stdin)
1102 else:
1103 self.stdin.close()
1104 if self.stdout:
1105 read_set.append(self.stdout)
Tim Peterse718f612004-10-12 21:51:32 +00001106 stdout = []
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001107 if self.stderr:
1108 read_set.append(self.stderr)
1109 stderr = []
1110
1111 while read_set or write_set:
1112 rlist, wlist, xlist = select.select(read_set, write_set, [])
1113
1114 if self.stdin in wlist:
1115 # When select has indicated that the file is writable,
1116 # we can write up to PIPE_BUF bytes without risk
1117 # blocking. POSIX defines PIPE_BUF >= 512
1118 bytes_written = os.write(self.stdin.fileno(), input[:512])
1119 input = input[bytes_written:]
1120 if not input:
1121 self.stdin.close()
1122 write_set.remove(self.stdin)
1123
1124 if self.stdout in rlist:
1125 data = os.read(self.stdout.fileno(), 1024)
1126 if data == "":
1127 self.stdout.close()
1128 read_set.remove(self.stdout)
1129 stdout.append(data)
1130
1131 if self.stderr in rlist:
1132 data = os.read(self.stderr.fileno(), 1024)
1133 if data == "":
1134 self.stderr.close()
1135 read_set.remove(self.stderr)
1136 stderr.append(data)
1137
1138 # All data exchanged. Translate lists into strings.
Peter Astrandd38ddf42005-02-10 08:32:50 +00001139 if stdout is not None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001140 stdout = ''.join(stdout)
Peter Astrandd38ddf42005-02-10 08:32:50 +00001141 if stderr is not None:
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001142 stderr = ''.join(stderr)
1143
1144 # Translate newlines, if requested. We cannot let the file
1145 # object do the translation: It is based on stdio, which is
1146 # impossible to combine with select (unless forcing no
1147 # buffering).
Thomas Wouters477c8d52006-05-27 19:21:47 +00001148 if self.universal_newlines and hasattr(file, 'newlines'):
Fredrik Lundh5b3687d2004-10-12 15:26:28 +00001149 if stdout:
1150 stdout = self._translate_newlines(stdout)
1151 if stderr:
1152 stderr = self._translate_newlines(stderr)
1153
1154 self.wait()
1155 return (stdout, stderr)
1156
1157
1158def _demo_posix():
1159 #
1160 # Example 1: Simple redirection: Get process list
1161 #
1162 plist = Popen(["ps"], stdout=PIPE).communicate()[0]
1163 print "Process list:"
1164 print plist
1165
1166 #
1167 # Example 2: Change uid before executing child
1168 #
1169 if os.getuid() == 0:
1170 p = Popen(["id"], preexec_fn=lambda: os.setuid(100))
1171 p.wait()
1172
1173 #
1174 # Example 3: Connecting several subprocesses
1175 #
1176 print "Looking for 'hda'..."
1177 p1 = Popen(["dmesg"], stdout=PIPE)
1178 p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
1179 print repr(p2.communicate()[0])
1180
1181 #
1182 # Example 4: Catch execution error
1183 #
1184 print
1185 print "Trying a weird file..."
1186 try:
1187 print Popen(["/this/path/does/not/exist"]).communicate()
1188 except OSError, e:
1189 if e.errno == errno.ENOENT:
1190 print "The file didn't exist. I thought so..."
1191 print "Child traceback:"
1192 print e.child_traceback
1193 else:
1194 print "Error", e.errno
1195 else:
1196 print >>sys.stderr, "Gosh. No error."
1197
1198
1199def _demo_windows():
1200 #
1201 # Example 1: Connecting several subprocesses
1202 #
1203 print "Looking for 'PROMPT' in set output..."
1204 p1 = Popen("set", stdout=PIPE, shell=True)
1205 p2 = Popen('find "PROMPT"', stdin=p1.stdout, stdout=PIPE)
1206 print repr(p2.communicate()[0])
1207
1208 #
1209 # Example 2: Simple execution of program
1210 #
1211 print "Executing calc..."
1212 p = Popen("calc")
1213 p.wait()
1214
1215
1216if __name__ == "__main__":
1217 if mswindows:
1218 _demo_windows()
1219 else:
1220 _demo_posix()