blob: d6ebf4b78f92caf11691962b31205c3560d80c53 [file] [log] [blame]
Ka-Ping Yeefeb67192001-03-02 23:31:43 +00001r"""OS routines for Mac, DOS, NT, or Posix depending on what system we're on.
Guido van Rossum31104f41992-01-14 18:28:36 +00002
Guido van Rossum54f22ed2000-02-04 15:10:34 +00003This exports:
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +00004 - all functions from posix, nt, dos, os2, mac, or ce, e.g. unlink, stat, etc.
5 - os.path is one of the modules posixpath, ntpath, macpath, or dospath
Guido van Rossumd74fb6b2001-03-02 06:43:49 +00006 - os.name is 'posix', 'nt', 'dos', 'os2', 'mac', 'ce' or 'riscos'
Guido van Rossum54f22ed2000-02-04 15:10:34 +00007 - os.curdir is a string representing the current directory ('.' or ':')
8 - os.pardir is a string representing the parent directory ('..' or '::')
9 - os.sep is the (or a most common) pathname separator ('/' or ':' or '\\')
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +000010 - os.altsep is the alternate pathname separator (None or '/')
Guido van Rossum54f22ed2000-02-04 15:10:34 +000011 - os.pathsep is the component separator used in $PATH etc
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +000012 - os.linesep is the line separator in text files ('\r' or '\n' or '\r\n')
Guido van Rossum54f22ed2000-02-04 15:10:34 +000013 - os.defpath is the default search path for executables
Guido van Rossum31104f41992-01-14 18:28:36 +000014
Guido van Rossum54f22ed2000-02-04 15:10:34 +000015Programs that import and use 'os' stand a better chance of being
16portable between different platforms. Of course, they must then
17only use functions that are defined by all platforms (e.g., unlink
18and opendir), and leave all pathname manipulation to os.path
19(e.g., split and join).
20"""
Guido van Rossum31104f41992-01-14 18:28:36 +000021
Skip Montanaro269b83b2001-02-06 01:07:02 +000022#'
23
Guido van Rossum2979b011994-08-01 11:18:30 +000024import sys
Guido van Rossuma28dab51997-08-29 22:36:47 +000025
26_names = sys.builtin_module_names
27
28altsep = None
29
Skip Montanaro6c0a0e12001-02-28 01:00:58 +000030__all__ = ["altsep", "curdir", "pardir", "sep", "pathsep", "linesep",
31 "defpath", "name"]
Skip Montanaro269b83b2001-02-06 01:07:02 +000032
33def _get_exports_list(module):
34 try:
35 return list(module.__all__)
36 except AttributeError:
37 return [n for n in dir(module) if n[0] != '_']
38
Guido van Rossuma28dab51997-08-29 22:36:47 +000039if 'posix' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000040 name = 'posix'
Guido van Rossume9387ea1998-05-22 15:26:04 +000041 linesep = '\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000042 curdir = '.'; pardir = '..'; sep = '/'; pathsep = ':'
43 defpath = ':/bin:/usr/bin'
44 from posix import *
45 try:
46 from posix import _exit
47 except ImportError:
48 pass
49 import posixpath
50 path = posixpath
51 del posixpath
Skip Montanaro269b83b2001-02-06 01:07:02 +000052
53 import posix
54 __all__.extend(_get_exports_list(posix))
55 del posix
56
Guido van Rossuma28dab51997-08-29 22:36:47 +000057elif 'nt' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000058 name = 'nt'
Guido van Rossume9387ea1998-05-22 15:26:04 +000059 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000060 curdir = '.'; pardir = '..'; sep = '\\'; pathsep = ';'
61 defpath = '.;C:\\bin'
62 from nt import *
Guido van Rossumfb801e71999-02-22 15:40:34 +000063 for i in ['_exit']:
Guido van Rossum67c65b21999-02-01 23:52:29 +000064 try:
65 exec "from nt import " + i
66 except ImportError:
67 pass
Guido van Rossum61de0ac1997-12-05 21:24:30 +000068 import ntpath
69 path = ntpath
70 del ntpath
Skip Montanaro269b83b2001-02-06 01:07:02 +000071
72 import nt
73 __all__.extend(_get_exports_list(nt))
74 del nt
75
Guido van Rossuma28dab51997-08-29 22:36:47 +000076elif 'dos' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000077 name = 'dos'
Guido van Rossume9387ea1998-05-22 15:26:04 +000078 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000079 curdir = '.'; pardir = '..'; sep = '\\'; pathsep = ';'
80 defpath = '.;C:\\bin'
81 from dos import *
82 try:
83 from dos import _exit
84 except ImportError:
85 pass
86 import dospath
87 path = dospath
88 del dospath
Skip Montanaro269b83b2001-02-06 01:07:02 +000089
90 import dos
91 __all__.extend(_get_exports_list(dos))
92 del dos
93
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000094elif 'os2' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000095 name = 'os2'
Guido van Rossume9387ea1998-05-22 15:26:04 +000096 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000097 curdir = '.'; pardir = '..'; sep = '\\'; pathsep = ';'
98 defpath = '.;C:\\bin'
99 from os2 import *
100 try:
101 from os2 import _exit
102 except ImportError:
103 pass
104 import ntpath
105 path = ntpath
106 del ntpath
Skip Montanaro269b83b2001-02-06 01:07:02 +0000107
108 import os2
109 __all__.extend(_get_exports_list(os2))
110 del os2
111
Guido van Rossuma28dab51997-08-29 22:36:47 +0000112elif 'mac' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000113 name = 'mac'
Guido van Rossume9387ea1998-05-22 15:26:04 +0000114 linesep = '\r'
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000115 curdir = ':'; pardir = '::'; sep = ':'; pathsep = '\n'
116 defpath = ':'
117 from mac import *
118 try:
119 from mac import _exit
120 except ImportError:
121 pass
122 import macpath
123 path = macpath
124 del macpath
Skip Montanaro269b83b2001-02-06 01:07:02 +0000125
126 import mac
127 __all__.extend(_get_exports_list(mac))
128 del mac
129
Guido van Rossum18df5d41999-06-11 01:37:27 +0000130elif 'ce' in _names:
131 name = 'ce'
132 linesep = '\r\n'
133 curdir = '.'; pardir = '..'; sep = '\\'; pathsep = ';'
134 defpath = '\\Windows'
135 from ce import *
136 for i in ['_exit']:
137 try:
138 exec "from ce import " + i
139 except ImportError:
140 pass
141 # We can use the standard Windows path.
142 import ntpath
143 path = ntpath
144 del ntpath
Skip Montanaro269b83b2001-02-06 01:07:02 +0000145
146 import ce
147 __all__.extend(_get_exports_list(ce))
148 del ce
149
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000150elif 'riscos' in _names:
151 name = 'riscos'
152 linesep = '\n'
153 curdir = '@'; pardir = '^'; sep = '.'; pathsep = ','
154 defpath = '<Run$Dir>'
155 from riscos import *
156 try:
157 from riscos import _exit
158 except ImportError:
159 pass
160 import riscospath
161 path = riscospath
162 del riscospath
163 from riscosenviron import environ
164
165 import riscos
166 __all__.extend(_get_exports_list(riscos))
167 del ce
168
Guido van Rossum2979b011994-08-01 11:18:30 +0000169else:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000170 raise ImportError, 'no os specific module found'
Guido van Rossume65cce51993-11-08 15:05:21 +0000171
Skip Montanaro269b83b2001-02-06 01:07:02 +0000172__all__.append("path")
173
Guido van Rossuma28dab51997-08-29 22:36:47 +0000174del _names
175
Fred Drake02379091999-01-19 16:05:13 +0000176sys.modules['os.path'] = path
177
Skip Montanaro269b83b2001-02-06 01:07:02 +0000178#'
179
Guido van Rossum4def7de1998-07-24 20:48:03 +0000180# Super directory utilities.
181# (Inspired by Eric Raymond; the doc strings are mostly his)
182
183def makedirs(name, mode=0777):
184 """makedirs(path [, mode=0777]) -> None
185
186 Super-mkdir; create a leaf directory and all intermediate ones.
187 Works like mkdir, except that any intermediate path segment (not
188 just the rightmost) will be created if it does not exist. This is
189 recursive.
190
191 """
192 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000193 if not tail:
194 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000195 if head and tail and not path.exists(head):
196 makedirs(head, mode)
197 mkdir(name, mode)
198
199def removedirs(name):
200 """removedirs(path) -> None
201
202 Super-rmdir; remove a leaf directory and empty all intermediate
203 ones. Works like rmdir except that, if the leaf directory is
204 successfully removed, directories corresponding to rightmost path
205 segments will be pruned way until either the whole path is
206 consumed or an error occurs. Errors during this latter phase are
207 ignored -- they generally mean that a directory was not empty.
208
209 """
210 rmdir(name)
211 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000212 if not tail:
213 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000214 while head and tail:
215 try:
216 rmdir(head)
217 except error:
218 break
219 head, tail = path.split(head)
220
221def renames(old, new):
222 """renames(old, new) -> None
223
224 Super-rename; create directories as necessary and delete any left
225 empty. Works like rename, except creation of any intermediate
226 directories needed to make the new pathname good is attempted
227 first. After the rename, directories corresponding to rightmost
228 path segments of the old name will be pruned way until either the
229 whole path is consumed or a nonempty directory is found.
230
231 Note: this function can fail with the new directory structure made
232 if you lack permissions needed to unlink the leaf directory or
233 file.
234
235 """
236 head, tail = path.split(new)
237 if head and tail and not path.exists(head):
238 makedirs(head)
239 rename(old, new)
240 head, tail = path.split(old)
241 if head and tail:
242 try:
243 removedirs(head)
244 except error:
245 pass
246
Skip Montanaro269b83b2001-02-06 01:07:02 +0000247__all__.extend(["makedirs", "removedirs", "renames"])
248
Guido van Rossuma28dab51997-08-29 22:36:47 +0000249# Make sure os.environ exists, at least
250try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000251 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000252except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000253 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000254
Guido van Rossume65cce51993-11-08 15:05:21 +0000255def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000256 """execl(file, *args)
257
258 Execute the executable file with argument list args, replacing the
259 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000260 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000261
262def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000263 """execle(file, *args, env)
264
265 Execute the executable file with argument list args and
266 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000267 env = args[-1]
268 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000269
270def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000271 """execlp(file, *args)
272
273 Execute the executable file (which is searched for along $PATH)
274 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000275 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000276
Guido van Rossum030afb11995-03-14 17:27:18 +0000277def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000278 """execlpe(file, *args, env)
279
280 Execute the executable file (which is searched for along $PATH)
281 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000282 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000283 env = args[-1]
284 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000285
Guido van Rossume65cce51993-11-08 15:05:21 +0000286def execvp(file, args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000287 """execp(file, args)
288
289 Execute the executable file (which is searched for along $PATH)
290 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000291 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000292 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000293
294def execvpe(file, args, env):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000295 """execv(file, args, env)
296
297 Execute the executable file (which is searched for along $PATH)
298 with argument list args and environment env , replacing the
299 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000300 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000301 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000302
Skip Montanaro269b83b2001-02-06 01:07:02 +0000303__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
304
Guido van Rossum030afb11995-03-14 17:27:18 +0000305_notfound = None
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000306def _execvpe(file, args, env=None):
307 if env is not None:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000308 func = execve
309 argrest = (args, env)
310 else:
311 func = execv
312 argrest = (args,)
313 env = environ
314 global _notfound
315 head, tail = path.split(file)
316 if head:
317 apply(func, (file,) + argrest)
318 return
319 if env.has_key('PATH'):
320 envpath = env['PATH']
321 else:
322 envpath = defpath
Guido van Rossum965fdae2000-04-04 19:50:04 +0000323 PATH = envpath.split(pathsep)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000324 if not _notfound:
Guido van Rossumb7fe4322001-03-02 07:04:51 +0000325 if sys.platform[:4] == 'beos':
326 # Process handling (fork, wait) under BeOS (up to 5.0)
327 # doesn't interoperate reliably with the thread interlocking
328 # that happens during an import. The actual error we need
329 # is the same on BeOS for posix.open() et al., ENOENT.
330 try: unlink('/_#.# ## #.#')
331 except error, _notfound: pass
332 else:
333 import tempfile
334 t = tempfile.mktemp()
335 # Exec a file that is guaranteed not to exist
336 try: execv(t, ('blah',))
337 except error, _notfound: pass
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000338 exc, arg = error, _notfound
339 for dir in PATH:
340 fullname = path.join(dir, file)
341 try:
342 apply(func, (fullname,) + argrest)
343 except error, (errno, msg):
344 if errno != arg[0]:
345 exc, arg = error, (errno, msg)
346 raise exc, arg
Guido van Rossum2979b011994-08-01 11:18:30 +0000347
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000348
349if name != "riscos":
350 # Change environ to automatically call putenv() if it exists
351 try:
352 # This will fail if there's no putenv
353 putenv
354 except NameError:
355 pass
356 else:
357 import UserDict
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000358
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000359 if name in ('os2', 'nt', 'dos'): # Where Env Var Names Must Be UPPERCASE
360 # But we store them as upper case
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000361 class _Environ(UserDict.UserDict):
362 def __init__(self, environ):
363 UserDict.UserDict.__init__(self)
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000364 data = self.data
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000365 for k, v in environ.items():
Guido van Rossum965fdae2000-04-04 19:50:04 +0000366 data[k.upper()] = v
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000367 def __setitem__(self, key, item):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000368 putenv(key, item)
Guido van Rossum965fdae2000-04-04 19:50:04 +0000369 self.data[key.upper()] = item
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000370 def __getitem__(self, key):
Guido van Rossum965fdae2000-04-04 19:50:04 +0000371 return self.data[key.upper()]
372 def __delitem__(self, key):
373 del self.data[key.upper()]
Guido van Rossumb46413f1999-05-03 15:23:24 +0000374 def has_key(self, key):
Guido van Rossum965fdae2000-04-04 19:50:04 +0000375 return self.data.has_key(key.upper())
376 def get(self, key, failobj=None):
377 return self.data.get(key.upper(), failobj)
378 def update(self, dict):
379 for k, v in dict.items():
380 self[k] = v
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000381
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000382 else: # Where Env Var Names Can Be Mixed Case
383 class _Environ(UserDict.UserDict):
384 def __init__(self, environ):
385 UserDict.UserDict.__init__(self)
386 self.data = environ
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000387 def __setitem__(self, key, item):
388 putenv(key, item)
389 self.data[key] = item
Guido van Rossum965fdae2000-04-04 19:50:04 +0000390 def update(self, dict):
391 for k, v in dict.items():
392 self[k] = v
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000393
394 environ = _Environ(environ)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000395
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000396 def getenv(key, default=None):
397 """Get an environment variable, return None if it doesn't exist.
398 The optional second argument can specify an alternate default."""
399 return environ.get(key, default)
400 __all__.append("getenv")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000401
402def _exists(name):
403 try:
404 eval(name)
405 return 1
406 except NameError:
407 return 0
408
409# Supply spawn*() (probably only for Unix)
410if _exists("fork") and not _exists("spawnv") and _exists("execv"):
411
412 P_WAIT = 0
413 P_NOWAIT = P_NOWAITO = 1
414
415 # XXX Should we support P_DETACH? I suppose it could fork()**2
416 # and close the std I/O streams. Also, P_OVERLAY is the same
417 # as execv*()?
418
419 def _spawnvef(mode, file, args, env, func):
420 # Internal helper; func is the exec*() function to use
421 pid = fork()
422 if not pid:
423 # Child
424 try:
425 if env is None:
426 func(file, args)
427 else:
428 func(file, args, env)
429 except:
430 _exit(127)
431 else:
432 # Parent
433 if mode == P_NOWAIT:
434 return pid # Caller is responsible for waiting!
435 while 1:
436 wpid, sts = waitpid(pid, 0)
437 if WIFSTOPPED(sts):
438 continue
439 elif WIFSIGNALED(sts):
440 return -WTERMSIG(sts)
441 elif WIFEXITED(sts):
442 return WEXITSTATUS(sts)
443 else:
444 raise error, "Not stopped, signaled or exited???"
445
446 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000447 """spawnv(mode, file, args) -> integer
448
449Execute file with arguments from args in a subprocess.
450If mode == P_NOWAIT return the pid of the process.
451If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000452otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000453 return _spawnvef(mode, file, args, None, execv)
454
455 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000456 """spawnve(mode, file, args, env) -> integer
457
458Execute file with arguments from args in a subprocess with the
459specified environment.
460If mode == P_NOWAIT return the pid of the process.
461If mode == P_WAIT return the process's exit code if it exits normally;
462otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000463 return _spawnvef(mode, file, args, env, execve)
464
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000465 # Note: spawnvp[e] is't currently supported on Windows
466
467 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000468 """spawnvp(mode, file, args) -> integer
469
470Execute file (which is looked for along $PATH) with arguments from
471args in a subprocess.
472If mode == P_NOWAIT return the pid of the process.
473If mode == P_WAIT return the process's exit code if it exits normally;
474otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000475 return _spawnvef(mode, file, args, None, execvp)
476
477 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000478 """spawnvpe(mode, file, args, env) -> integer
479
480Execute file (which is looked for along $PATH) with arguments from
481args in a subprocess with the supplied environment.
482If mode == P_NOWAIT return the pid of the process.
483If mode == P_WAIT return the process's exit code if it exits normally;
484otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000485 return _spawnvef(mode, file, args, env, execvpe)
486
487if _exists("spawnv"):
488 # These aren't supplied by the basic Windows code
489 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000490
491 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000492 """spawnl(mode, file, *args) -> integer
493
494Execute file with arguments from args in a subprocess.
495If mode == P_NOWAIT return the pid of the process.
496If mode == P_WAIT return the process's exit code if it exits normally;
497otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000498 return spawnv(mode, file, args)
499
500 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000501 """spawnle(mode, file, *args, env) -> integer
502
503Execute file with arguments from args in a subprocess with the
504supplied environment.
505If mode == P_NOWAIT return the pid of the process.
506If mode == P_WAIT return the process's exit code if it exits normally;
507otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000508 env = args[-1]
509 return spawnve(mode, file, args[:-1], env)
510
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000511if _exists("spawnvp"):
512 # At the moment, Windows doesn't implement spawnvp[e],
513 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000514 def spawnlp(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000515 """spawnlp(mode, file, *args, env) -> integer
516
517Execute file (which is looked for along $PATH) with arguments from
518args in a subprocess with the supplied environment.
519If mode == P_NOWAIT return the pid of the process.
520If mode == P_WAIT return the process's exit code if it exits normally;
521otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000522 return spawnvp(mode, file, args)
523
524 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000525 """spawnlpe(mode, file, *args, env) -> integer
526
527Execute file (which is looked for along $PATH) with arguments from
528args in a subprocess with the supplied environment.
529If mode == P_NOWAIT return the pid of the process.
530If mode == P_WAIT return the process's exit code if it exits normally;
531otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000532 env = args[-1]
533 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000534
535
Skip Montanaro269b83b2001-02-06 01:07:02 +0000536 __all__.extend(["spawnlp","spawnlpe","spawnv", "spawnve","spawnvp",
537 "spawnvpe","spawnl","spawnle",])
538
539
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000540# Supply popen2 etc. (for Unix)
541if _exists("fork"):
542 if not _exists("popen2"):
543 def popen2(cmd, mode="t", bufsize=-1):
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000544 import popen2
545 stdout, stdin = popen2.popen2(cmd, bufsize)
546 return stdin, stdout
Skip Montanaro269b83b2001-02-06 01:07:02 +0000547 __all__.append("popen2")
Fred Drake31f182e2000-08-28 17:20:05 +0000548
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000549 if not _exists("popen3"):
550 def popen3(cmd, mode="t", bufsize=-1):
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000551 import popen2
552 stdout, stdin, stderr = popen2.popen3(cmd, bufsize)
553 return stdin, stdout, stderr
Skip Montanaro269b83b2001-02-06 01:07:02 +0000554 __all__.append("popen3")
Fred Drake20af3172000-09-28 19:10:56 +0000555
556 if not _exists("popen4"):
557 def popen4(cmd, mode="t", bufsize=-1):
558 import popen2
559 stdout, stdin = popen2.popen4(cmd, bufsize)
560 return stdin, stdout
Skip Montanaro269b83b2001-02-06 01:07:02 +0000561 __all__.append("popen4")