blob: 64caee6efae0186c1522a5b2adbe23a927b762be [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
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000163
164 import riscos
165 __all__.extend(_get_exports_list(riscos))
Skip Montanaro81e4b1c2001-03-06 15:26:07 +0000166 del riscos
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000167
Guido van Rossum2979b011994-08-01 11:18:30 +0000168else:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000169 raise ImportError, 'no os specific module found'
Guido van Rossume65cce51993-11-08 15:05:21 +0000170
Skip Montanaro269b83b2001-02-06 01:07:02 +0000171__all__.append("path")
172
Guido van Rossuma28dab51997-08-29 22:36:47 +0000173del _names
174
Fred Drake02379091999-01-19 16:05:13 +0000175sys.modules['os.path'] = path
176
Skip Montanaro269b83b2001-02-06 01:07:02 +0000177#'
178
Guido van Rossum4def7de1998-07-24 20:48:03 +0000179# Super directory utilities.
180# (Inspired by Eric Raymond; the doc strings are mostly his)
181
182def makedirs(name, mode=0777):
183 """makedirs(path [, mode=0777]) -> None
184
185 Super-mkdir; create a leaf directory and all intermediate ones.
186 Works like mkdir, except that any intermediate path segment (not
187 just the rightmost) will be created if it does not exist. This is
188 recursive.
189
190 """
191 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000192 if not tail:
193 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000194 if head and tail and not path.exists(head):
195 makedirs(head, mode)
196 mkdir(name, mode)
197
198def removedirs(name):
199 """removedirs(path) -> None
200
201 Super-rmdir; remove a leaf directory and empty all intermediate
202 ones. Works like rmdir except that, if the leaf directory is
203 successfully removed, directories corresponding to rightmost path
204 segments will be pruned way until either the whole path is
205 consumed or an error occurs. Errors during this latter phase are
206 ignored -- they generally mean that a directory was not empty.
207
208 """
209 rmdir(name)
210 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000211 if not tail:
212 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000213 while head and tail:
214 try:
215 rmdir(head)
216 except error:
217 break
218 head, tail = path.split(head)
219
220def renames(old, new):
221 """renames(old, new) -> None
222
223 Super-rename; create directories as necessary and delete any left
224 empty. Works like rename, except creation of any intermediate
225 directories needed to make the new pathname good is attempted
226 first. After the rename, directories corresponding to rightmost
227 path segments of the old name will be pruned way until either the
228 whole path is consumed or a nonempty directory is found.
229
230 Note: this function can fail with the new directory structure made
231 if you lack permissions needed to unlink the leaf directory or
232 file.
233
234 """
235 head, tail = path.split(new)
236 if head and tail and not path.exists(head):
237 makedirs(head)
238 rename(old, new)
239 head, tail = path.split(old)
240 if head and tail:
241 try:
242 removedirs(head)
243 except error:
244 pass
245
Skip Montanaro269b83b2001-02-06 01:07:02 +0000246__all__.extend(["makedirs", "removedirs", "renames"])
247
Guido van Rossuma28dab51997-08-29 22:36:47 +0000248# Make sure os.environ exists, at least
249try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000250 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000251except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000252 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000253
Guido van Rossume65cce51993-11-08 15:05:21 +0000254def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000255 """execl(file, *args)
256
257 Execute the executable file with argument list args, replacing the
258 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000259 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000260
261def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000262 """execle(file, *args, env)
263
264 Execute the executable file with argument list args and
265 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000266 env = args[-1]
267 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000268
269def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000270 """execlp(file, *args)
271
272 Execute the executable file (which is searched for along $PATH)
273 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000274 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000275
Guido van Rossum030afb11995-03-14 17:27:18 +0000276def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000277 """execlpe(file, *args, env)
278
279 Execute the executable file (which is searched for along $PATH)
280 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000281 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000282 env = args[-1]
283 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000284
Guido van Rossume65cce51993-11-08 15:05:21 +0000285def execvp(file, args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000286 """execp(file, args)
287
288 Execute the executable file (which is searched for along $PATH)
289 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000290 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000291 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000292
293def execvpe(file, args, env):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000294 """execv(file, args, env)
295
296 Execute the executable file (which is searched for along $PATH)
297 with argument list args and environment env , replacing the
298 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000299 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000300 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000301
Skip Montanaro269b83b2001-02-06 01:07:02 +0000302__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
303
Guido van Rossum030afb11995-03-14 17:27:18 +0000304_notfound = None
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000305def _execvpe(file, args, env=None):
306 if env is not None:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000307 func = execve
308 argrest = (args, env)
309 else:
310 func = execv
311 argrest = (args,)
312 env = environ
313 global _notfound
314 head, tail = path.split(file)
315 if head:
316 apply(func, (file,) + argrest)
317 return
318 if env.has_key('PATH'):
319 envpath = env['PATH']
320 else:
321 envpath = defpath
Guido van Rossum965fdae2000-04-04 19:50:04 +0000322 PATH = envpath.split(pathsep)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000323 if not _notfound:
Guido van Rossumb7fe4322001-03-02 07:04:51 +0000324 if sys.platform[:4] == 'beos':
325 # Process handling (fork, wait) under BeOS (up to 5.0)
326 # doesn't interoperate reliably with the thread interlocking
327 # that happens during an import. The actual error we need
328 # is the same on BeOS for posix.open() et al., ENOENT.
329 try: unlink('/_#.# ## #.#')
330 except error, _notfound: pass
331 else:
332 import tempfile
333 t = tempfile.mktemp()
334 # Exec a file that is guaranteed not to exist
335 try: execv(t, ('blah',))
336 except error, _notfound: pass
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000337 exc, arg = error, _notfound
338 for dir in PATH:
339 fullname = path.join(dir, file)
340 try:
341 apply(func, (fullname,) + argrest)
342 except error, (errno, msg):
343 if errno != arg[0]:
344 exc, arg = error, (errno, msg)
345 raise exc, arg
Guido van Rossum2979b011994-08-01 11:18:30 +0000346
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000347
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000348# Change environ to automatically call putenv() if it exists
349try:
350 # This will fail if there's no putenv
351 putenv
352except NameError:
353 pass
354else:
355 import UserDict
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000356
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000357 if name == "riscos":
358 # On RISC OS, all env access goes through getenv and putenv
359 from riscosenviron import _Environ
360 elif name in ('os2', 'nt', 'dos'): # Where Env Var Names Must Be UPPERCASE
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000361 # But we store them as upper case
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000362 class _Environ(UserDict.UserDict):
363 def __init__(self, environ):
364 UserDict.UserDict.__init__(self)
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000365 data = self.data
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000366 for k, v in environ.items():
Guido van Rossum965fdae2000-04-04 19:50:04 +0000367 data[k.upper()] = v
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000368 def __setitem__(self, key, item):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000369 putenv(key, item)
Guido van Rossum965fdae2000-04-04 19:50:04 +0000370 self.data[key.upper()] = item
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000371 def __getitem__(self, key):
Guido van Rossum965fdae2000-04-04 19:50:04 +0000372 return self.data[key.upper()]
373 def __delitem__(self, key):
374 del self.data[key.upper()]
Guido van Rossumb46413f1999-05-03 15:23:24 +0000375 def has_key(self, key):
Guido van Rossum965fdae2000-04-04 19:50:04 +0000376 return self.data.has_key(key.upper())
377 def get(self, key, failobj=None):
378 return self.data.get(key.upper(), failobj)
379 def update(self, dict):
380 for k, v in dict.items():
381 self[k] = v
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000382
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000383 else: # Where Env Var Names Can Be Mixed Case
384 class _Environ(UserDict.UserDict):
385 def __init__(self, environ):
386 UserDict.UserDict.__init__(self)
387 self.data = environ
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000388 def __setitem__(self, key, item):
389 putenv(key, item)
390 self.data[key] = item
Guido van Rossum965fdae2000-04-04 19:50:04 +0000391 def update(self, dict):
392 for k, v in dict.items():
393 self[k] = v
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000394
395 environ = _Environ(environ)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000396
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000397 def getenv(key, default=None):
398 """Get an environment variable, return None if it doesn't exist.
399 The optional second argument can specify an alternate default."""
400 return environ.get(key, default)
401 __all__.append("getenv")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000402
403def _exists(name):
404 try:
405 eval(name)
406 return 1
407 except NameError:
408 return 0
409
410# Supply spawn*() (probably only for Unix)
411if _exists("fork") and not _exists("spawnv") and _exists("execv"):
412
413 P_WAIT = 0
414 P_NOWAIT = P_NOWAITO = 1
415
416 # XXX Should we support P_DETACH? I suppose it could fork()**2
417 # and close the std I/O streams. Also, P_OVERLAY is the same
418 # as execv*()?
419
420 def _spawnvef(mode, file, args, env, func):
421 # Internal helper; func is the exec*() function to use
422 pid = fork()
423 if not pid:
424 # Child
425 try:
426 if env is None:
427 func(file, args)
428 else:
429 func(file, args, env)
430 except:
431 _exit(127)
432 else:
433 # Parent
434 if mode == P_NOWAIT:
435 return pid # Caller is responsible for waiting!
436 while 1:
437 wpid, sts = waitpid(pid, 0)
438 if WIFSTOPPED(sts):
439 continue
440 elif WIFSIGNALED(sts):
441 return -WTERMSIG(sts)
442 elif WIFEXITED(sts):
443 return WEXITSTATUS(sts)
444 else:
445 raise error, "Not stopped, signaled or exited???"
446
447 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000448 """spawnv(mode, file, args) -> integer
449
450Execute file with arguments from args in a subprocess.
451If mode == P_NOWAIT return the pid of the process.
452If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000453otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000454 return _spawnvef(mode, file, args, None, execv)
455
456 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000457 """spawnve(mode, file, args, env) -> integer
458
459Execute file with arguments from args in a subprocess with the
460specified environment.
461If mode == P_NOWAIT return the pid of the process.
462If mode == P_WAIT return the process's exit code if it exits normally;
463otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000464 return _spawnvef(mode, file, args, env, execve)
465
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000466 # Note: spawnvp[e] is't currently supported on Windows
467
468 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000469 """spawnvp(mode, file, args) -> integer
470
471Execute file (which is looked for along $PATH) with arguments from
472args in a subprocess.
473If mode == P_NOWAIT return the pid of the process.
474If mode == P_WAIT return the process's exit code if it exits normally;
475otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000476 return _spawnvef(mode, file, args, None, execvp)
477
478 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000479 """spawnvpe(mode, file, args, env) -> integer
480
481Execute file (which is looked for along $PATH) with arguments from
482args in a subprocess with the supplied environment.
483If mode == P_NOWAIT return the pid of the process.
484If mode == P_WAIT return the process's exit code if it exits normally;
485otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000486 return _spawnvef(mode, file, args, env, execvpe)
487
488if _exists("spawnv"):
489 # These aren't supplied by the basic Windows code
490 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000491
492 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000493 """spawnl(mode, file, *args) -> integer
494
495Execute file with arguments from args in a subprocess.
496If mode == P_NOWAIT return the pid of the process.
497If mode == P_WAIT return the process's exit code if it exits normally;
498otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000499 return spawnv(mode, file, args)
500
501 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000502 """spawnle(mode, file, *args, env) -> integer
503
504Execute file with arguments from args in a subprocess with the
505supplied environment.
506If mode == P_NOWAIT return the pid of the process.
507If mode == P_WAIT return the process's exit code if it exits normally;
508otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000509 env = args[-1]
510 return spawnve(mode, file, args[:-1], env)
511
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000512if _exists("spawnvp"):
513 # At the moment, Windows doesn't implement spawnvp[e],
514 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000515 def spawnlp(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000516 """spawnlp(mode, file, *args, env) -> integer
517
518Execute file (which is looked for along $PATH) with arguments from
519args in a subprocess with the supplied environment.
520If mode == P_NOWAIT return the pid of the process.
521If mode == P_WAIT return the process's exit code if it exits normally;
522otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000523 return spawnvp(mode, file, args)
524
525 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000526 """spawnlpe(mode, file, *args, env) -> integer
527
528Execute file (which is looked for along $PATH) with arguments from
529args in a subprocess with the supplied environment.
530If mode == P_NOWAIT return the pid of the process.
531If mode == P_WAIT return the process's exit code if it exits normally;
532otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000533 env = args[-1]
534 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000535
536
Skip Montanaro269b83b2001-02-06 01:07:02 +0000537 __all__.extend(["spawnlp","spawnlpe","spawnv", "spawnve","spawnvp",
538 "spawnvpe","spawnl","spawnle",])
539
540
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000541# Supply popen2 etc. (for Unix)
542if _exists("fork"):
543 if not _exists("popen2"):
544 def popen2(cmd, mode="t", bufsize=-1):
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000545 import popen2
546 stdout, stdin = popen2.popen2(cmd, bufsize)
547 return stdin, stdout
Skip Montanaro269b83b2001-02-06 01:07:02 +0000548 __all__.append("popen2")
Fred Drake31f182e2000-08-28 17:20:05 +0000549
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000550 if not _exists("popen3"):
551 def popen3(cmd, mode="t", bufsize=-1):
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000552 import popen2
553 stdout, stdin, stderr = popen2.popen3(cmd, bufsize)
554 return stdin, stdout, stderr
Skip Montanaro269b83b2001-02-06 01:07:02 +0000555 __all__.append("popen3")
Fred Drake20af3172000-09-28 19:10:56 +0000556
557 if not _exists("popen4"):
558 def popen4(cmd, mode="t", bufsize=-1):
559 import popen2
560 stdout, stdin = popen2.popen4(cmd, bufsize)
561 return stdin, stdout
Skip Montanaro269b83b2001-02-06 01:07:02 +0000562 __all__.append("popen4")