blob: 145b3406cf5c7b3363dba4629742b6b5568cde9e [file] [log] [blame]
Guido van Rossum54f22ed2000-02-04 15:10:34 +00001"""Spawn a command with pipes to its stdin, stdout, and optionally stderr.
2
3The normal os.popen(cmd, mode) call spawns a shell command and provides a
4file interface to just the input or output of the process depending on
5whether mode is 'r' or 'w'. This module provides the functions popen2(cmd)
6and popen3(cmd) which return two or three pipes to the spawned command.
7"""
8
Guido van Rossum9a22de11995-01-12 12:29:47 +00009import os
10import sys
Neal Norwitz42dd86b2007-05-11 06:57:33 +000011import warnings
12warnings.warn("The popen2 module is deprecated. Use the subprocess module.",
13 DeprecationWarning, stacklevel=2)
Guido van Rossum9a22de11995-01-12 12:29:47 +000014
Skip Montanaro57fd45e2002-03-12 19:48:03 +000015__all__ = ["popen2", "popen3", "popen4"]
Skip Montanaro352674d2001-02-07 23:14:30 +000016
Martin v. Löwisf563c8b2003-10-06 21:34:33 +000017try:
18 MAXFD = os.sysconf('SC_OPEN_MAX')
19except (AttributeError, ValueError):
20 MAXFD = 256
Guido van Rossum9a22de11995-01-12 12:29:47 +000021
Guido van Rossum0357d021997-08-11 03:27:24 +000022_active = []
23
24def _cleanup():
25 for inst in _active[:]:
Martin v. Löwis478c82d2006-03-24 08:14:54 +000026 if inst.poll(_deadstate=sys.maxint) >= 0:
27 try:
28 _active.remove(inst)
29 except ValueError:
30 # This can happen if two threads create a new Popen instance.
31 # It's harmless that it was already removed, so ignore.
32 pass
Guido van Rossum0357d021997-08-11 03:27:24 +000033
34class Popen3:
Guido van Rossum54f22ed2000-02-04 15:10:34 +000035 """Class representing a child process. Normally instances are created
36 by the factory functions popen2() and popen3()."""
37
Fred Draked75e63a2000-09-28 19:07:53 +000038 sts = -1 # Child not completed yet
39
Fred Drakeb5aa4072003-07-07 21:36:19 +000040 def __init__(self, cmd, capturestderr=False, bufsize=-1):
Guido van Rossum54f22ed2000-02-04 15:10:34 +000041 """The parameter 'cmd' is the shell command to execute in a
Johannes Gijsbers9fc97892004-10-11 18:12:20 +000042 sub-process. On UNIX, 'cmd' may be a sequence, in which case arguments
43 will be passed directly to the program without shell intervention (as
44 with os.spawnv()). If 'cmd' is a string it will be passed to the shell
45 (as with os.system()). The 'capturestderr' flag, if true, specifies
46 that the object should capture standard error output of the child
47 process. The default is false. If the 'bufsize' parameter is
48 specified, it specifies the size of the I/O buffers to/from the child
49 process."""
Fred Draked75e63a2000-09-28 19:07:53 +000050 _cleanup()
Martin v. Löwisbd8dbab2006-03-23 18:18:35 +000051 self.cmd = cmd
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000052 p2cread, p2cwrite = os.pipe()
53 c2pread, c2pwrite = os.pipe()
54 if capturestderr:
55 errout, errin = os.pipe()
56 self.pid = os.fork()
57 if self.pid == 0:
58 # Child
Fred Draked75e63a2000-09-28 19:07:53 +000059 os.dup2(p2cread, 0)
60 os.dup2(c2pwrite, 1)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000061 if capturestderr:
Fred Draked75e63a2000-09-28 19:07:53 +000062 os.dup2(errin, 2)
63 self._run_child(cmd)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000064 os.close(p2cread)
65 self.tochild = os.fdopen(p2cwrite, 'w', bufsize)
66 os.close(c2pwrite)
67 self.fromchild = os.fdopen(c2pread, 'r', bufsize)
68 if capturestderr:
69 os.close(errin)
70 self.childerr = os.fdopen(errout, 'r', bufsize)
71 else:
72 self.childerr = None
Martin v. Löwis478c82d2006-03-24 08:14:54 +000073
74 def __del__(self):
75 # In case the child hasn't been waited on, check if it's done.
76 self.poll(_deadstate=sys.maxint)
77 if self.sts < 0:
Georg Brandl4085f142006-07-21 17:36:31 +000078 if _active is not None:
Georg Brandlcfecd592006-05-25 18:44:09 +000079 # Child is still running, keep us alive until we can wait on it.
80 _active.append(self)
Guido van Rossum54f22ed2000-02-04 15:10:34 +000081
Fred Draked75e63a2000-09-28 19:07:53 +000082 def _run_child(self, cmd):
Walter Dörwald65230a22002-06-03 15:58:32 +000083 if isinstance(cmd, basestring):
Fred Draked75e63a2000-09-28 19:07:53 +000084 cmd = ['/bin/sh', '-c', cmd]
Peter Astrandff355f12006-06-22 20:21:26 +000085 for i in xrange(3, MAXFD):
Fred Draked75e63a2000-09-28 19:07:53 +000086 try:
87 os.close(i)
Skip Montanaro1c90d7a2002-03-24 20:48:26 +000088 except OSError:
Fred Draked75e63a2000-09-28 19:07:53 +000089 pass
90 try:
91 os.execvp(cmd[0], cmd)
92 finally:
93 os._exit(1)
94
Martin v. Löwis478c82d2006-03-24 08:14:54 +000095 def poll(self, _deadstate=None):
Guido van Rossum54f22ed2000-02-04 15:10:34 +000096 """Return the exit status of the child process if it has finished,
97 or -1 if it hasn't finished yet."""
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000098 if self.sts < 0:
99 try:
100 pid, sts = os.waitpid(self.pid, os.WNOHANG)
Martin v. Löwisb95caff2006-03-24 08:26:26 +0000101 # pid will be 0 if self.pid hasn't terminated
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000102 if pid == self.pid:
103 self.sts = sts
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000104 except os.error:
Martin v. Löwis478c82d2006-03-24 08:14:54 +0000105 if _deadstate is not None:
106 self.sts = _deadstate
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000107 return self.sts
Guido van Rossum54f22ed2000-02-04 15:10:34 +0000108
Guido van Rossum0357d021997-08-11 03:27:24 +0000109 def wait(self):
Guido van Rossum54f22ed2000-02-04 15:10:34 +0000110 """Wait for and return the exit status of the child process."""
Guido van Rossum3800ef72003-06-02 19:12:01 +0000111 if self.sts < 0:
112 pid, sts = os.waitpid(self.pid, 0)
Martin v. Löwisb95caff2006-03-24 08:26:26 +0000113 # This used to be a test, but it is believed to be
114 # always true, so I changed it to an assertion - mvl
115 assert pid == self.pid
116 self.sts = sts
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000117 return self.sts
Guido van Rossumcaa9f231997-04-21 14:15:55 +0000118
Fred Drake31f182e2000-08-28 17:20:05 +0000119
Fred Draked75e63a2000-09-28 19:07:53 +0000120class Popen4(Popen3):
121 childerr = None
122
123 def __init__(self, cmd, bufsize=-1):
124 _cleanup()
Martin v. Löwis478c82d2006-03-24 08:14:54 +0000125 self.cmd = cmd
Fred Draked75e63a2000-09-28 19:07:53 +0000126 p2cread, p2cwrite = os.pipe()
127 c2pread, c2pwrite = os.pipe()
128 self.pid = os.fork()
129 if self.pid == 0:
130 # Child
131 os.dup2(p2cread, 0)
132 os.dup2(c2pwrite, 1)
133 os.dup2(c2pwrite, 2)
134 self._run_child(cmd)
135 os.close(p2cread)
136 self.tochild = os.fdopen(p2cwrite, 'w', bufsize)
137 os.close(c2pwrite)
138 self.fromchild = os.fdopen(c2pread, 'r', bufsize)
Fred Draked75e63a2000-09-28 19:07:53 +0000139
140
Andrew MacIntyre5cef5712002-02-24 05:32:32 +0000141if sys.platform[:3] == "win" or sys.platform == "os2emx":
Fred Draked75e63a2000-09-28 19:07:53 +0000142 # Some things don't make sense on non-Unix platforms.
Tim Petersd2152182000-10-03 23:07:13 +0000143 del Popen3, Popen4
Fred Draked75e63a2000-09-28 19:07:53 +0000144
145 def popen2(cmd, bufsize=-1, mode='t'):
Johannes Gijsbers9fc97892004-10-11 18:12:20 +0000146 """Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd' may
147 be a sequence, in which case arguments will be passed directly to the
148 program without shell intervention (as with os.spawnv()). If 'cmd' is a
149 string it will be passed to the shell (as with os.system()). If
150 'bufsize' is specified, it sets the buffer size for the I/O pipes. The
151 file objects (child_stdout, child_stdin) are returned."""
Fredrik Lundh9ac81f62000-07-09 23:35:24 +0000152 w, r = os.popen2(cmd, mode, bufsize)
153 return r, w
Guido van Rossumcaa9f231997-04-21 14:15:55 +0000154
Fred Draked75e63a2000-09-28 19:07:53 +0000155 def popen3(cmd, bufsize=-1, mode='t'):
Johannes Gijsbers9fc97892004-10-11 18:12:20 +0000156 """Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd' may
157 be a sequence, in which case arguments will be passed directly to the
158 program without shell intervention (as with os.spawnv()). If 'cmd' is a
159 string it will be passed to the shell (as with os.system()). If
160 'bufsize' is specified, it sets the buffer size for the I/O pipes. The
161 file objects (child_stdout, child_stdin, child_stderr) are returned."""
Fredrik Lundh9ac81f62000-07-09 23:35:24 +0000162 w, r, e = os.popen3(cmd, mode, bufsize)
163 return r, w, e
Fredrik Lundhbb7eeff2000-07-09 17:59:32 +0000164
Fred Draked75e63a2000-09-28 19:07:53 +0000165 def popen4(cmd, bufsize=-1, mode='t'):
Johannes Gijsbers9fc97892004-10-11 18:12:20 +0000166 """Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd' may
167 be a sequence, in which case arguments will be passed directly to the
168 program without shell intervention (as with os.spawnv()). If 'cmd' is a
169 string it will be passed to the shell (as with os.system()). If
170 'bufsize' is specified, it sets the buffer size for the I/O pipes. The
171 file objects (child_stdout_stderr, child_stdin) are returned."""
Fredrik Lundh9ac81f62000-07-09 23:35:24 +0000172 w, r = os.popen4(cmd, mode, bufsize)
173 return r, w
174else:
Fred Draked75e63a2000-09-28 19:07:53 +0000175 def popen2(cmd, bufsize=-1, mode='t'):
Johannes Gijsbers9fc97892004-10-11 18:12:20 +0000176 """Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd' may
177 be a sequence, in which case arguments will be passed directly to the
178 program without shell intervention (as with os.spawnv()). If 'cmd' is a
179 string it will be passed to the shell (as with os.system()). If
180 'bufsize' is specified, it sets the buffer size for the I/O pipes. The
181 file objects (child_stdout, child_stdin) are returned."""
Fred Drakeb5aa4072003-07-07 21:36:19 +0000182 inst = Popen3(cmd, False, bufsize)
Fred Draked75e63a2000-09-28 19:07:53 +0000183 return inst.fromchild, inst.tochild
184
185 def popen3(cmd, bufsize=-1, mode='t'):
Johannes Gijsbers9fc97892004-10-11 18:12:20 +0000186 """Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd' may
187 be a sequence, in which case arguments will be passed directly to the
188 program without shell intervention (as with os.spawnv()). If 'cmd' is a
189 string it will be passed to the shell (as with os.system()). If
190 'bufsize' is specified, it sets the buffer size for the I/O pipes. The
191 file objects (child_stdout, child_stdin, child_stderr) are returned."""
Fred Drakeb5aa4072003-07-07 21:36:19 +0000192 inst = Popen3(cmd, True, bufsize)
Fred Draked75e63a2000-09-28 19:07:53 +0000193 return inst.fromchild, inst.tochild, inst.childerr
194
195 def popen4(cmd, bufsize=-1, mode='t'):
Johannes Gijsbers9fc97892004-10-11 18:12:20 +0000196 """Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd' may
197 be a sequence, in which case arguments will be passed directly to the
198 program without shell intervention (as with os.spawnv()). If 'cmd' is a
199 string it will be passed to the shell (as with os.system()). If
200 'bufsize' is specified, it sets the buffer size for the I/O pipes. The
201 file objects (child_stdout_stderr, child_stdin) are returned."""
Fred Draked75e63a2000-09-28 19:07:53 +0000202 inst = Popen4(cmd, bufsize)
203 return inst.fromchild, inst.tochild
Guido van Rossum0357d021997-08-11 03:27:24 +0000204
Skip Montanaro352674d2001-02-07 23:14:30 +0000205 __all__.extend(["Popen3", "Popen4"])