blob: 9a7417bf6283054ace2a978759b1b2cceb21109b [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
Guido van Rossumc524d952001-10-19 01:31:59 +0000357 # Fake unsetenv() for Windows
358 # not sure about os2 and dos here but
359 # I'm guessing they are the same.
360
361 if name in ('os2', 'nt', 'dos'):
362 def unsetenv(key):
363 putenv(key, "")
364
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000365 if name == "riscos":
366 # On RISC OS, all env access goes through getenv and putenv
367 from riscosenviron import _Environ
368 elif name in ('os2', 'nt', 'dos'): # Where Env Var Names Must Be UPPERCASE
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000369 # But we store them as upper case
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000370 class _Environ(UserDict.UserDict):
371 def __init__(self, environ):
372 UserDict.UserDict.__init__(self)
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000373 data = self.data
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000374 for k, v in environ.items():
Guido van Rossum965fdae2000-04-04 19:50:04 +0000375 data[k.upper()] = v
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000376 def __setitem__(self, key, item):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000377 putenv(key, item)
Guido van Rossum965fdae2000-04-04 19:50:04 +0000378 self.data[key.upper()] = item
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000379 def __getitem__(self, key):
Guido van Rossum965fdae2000-04-04 19:50:04 +0000380 return self.data[key.upper()]
Guido van Rossumc524d952001-10-19 01:31:59 +0000381 try:
382 unsetenv
383 except NameError:
384 def __delitem__(self, key):
385 del self.data[key.upper()]
386 else:
387 def __delitem__(self, key):
388 unsetenv(key)
389 del self.data[key.upper()]
Guido van Rossumb46413f1999-05-03 15:23:24 +0000390 def has_key(self, key):
Guido van Rossum965fdae2000-04-04 19:50:04 +0000391 return self.data.has_key(key.upper())
392 def get(self, key, failobj=None):
393 return self.data.get(key.upper(), failobj)
394 def update(self, dict):
395 for k, v in dict.items():
396 self[k] = v
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000397
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000398 else: # Where Env Var Names Can Be Mixed Case
399 class _Environ(UserDict.UserDict):
400 def __init__(self, environ):
401 UserDict.UserDict.__init__(self)
402 self.data = environ
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000403 def __setitem__(self, key, item):
404 putenv(key, item)
405 self.data[key] = item
Guido van Rossum965fdae2000-04-04 19:50:04 +0000406 def update(self, dict):
407 for k, v in dict.items():
408 self[k] = v
Guido van Rossumc524d952001-10-19 01:31:59 +0000409 try:
410 unsetenv
411 except NameError:
412 pass
413 else:
414 def __delitem__(self, key):
415 unsetenv(key)
416 del self.data[key]
417
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000418
419 environ = _Environ(environ)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000420
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000421 def getenv(key, default=None):
422 """Get an environment variable, return None if it doesn't exist.
423 The optional second argument can specify an alternate default."""
424 return environ.get(key, default)
425 __all__.append("getenv")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000426
427def _exists(name):
428 try:
429 eval(name)
430 return 1
431 except NameError:
432 return 0
433
434# Supply spawn*() (probably only for Unix)
435if _exists("fork") and not _exists("spawnv") and _exists("execv"):
436
437 P_WAIT = 0
438 P_NOWAIT = P_NOWAITO = 1
439
440 # XXX Should we support P_DETACH? I suppose it could fork()**2
441 # and close the std I/O streams. Also, P_OVERLAY is the same
442 # as execv*()?
443
444 def _spawnvef(mode, file, args, env, func):
445 # Internal helper; func is the exec*() function to use
446 pid = fork()
447 if not pid:
448 # Child
449 try:
450 if env is None:
451 func(file, args)
452 else:
453 func(file, args, env)
454 except:
455 _exit(127)
456 else:
457 # Parent
458 if mode == P_NOWAIT:
459 return pid # Caller is responsible for waiting!
460 while 1:
461 wpid, sts = waitpid(pid, 0)
462 if WIFSTOPPED(sts):
463 continue
464 elif WIFSIGNALED(sts):
465 return -WTERMSIG(sts)
466 elif WIFEXITED(sts):
467 return WEXITSTATUS(sts)
468 else:
469 raise error, "Not stopped, signaled or exited???"
470
471 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000472 """spawnv(mode, file, args) -> integer
473
474Execute file with arguments from args in a subprocess.
475If mode == P_NOWAIT return the pid of the process.
476If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000477otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000478 return _spawnvef(mode, file, args, None, execv)
479
480 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000481 """spawnve(mode, file, args, env) -> integer
482
483Execute file with arguments from args in a subprocess with the
484specified environment.
485If mode == P_NOWAIT return the pid of the process.
486If mode == P_WAIT return the process's exit code if it exits normally;
487otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000488 return _spawnvef(mode, file, args, env, execve)
489
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000490 # Note: spawnvp[e] is't currently supported on Windows
491
492 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000493 """spawnvp(mode, file, args) -> integer
494
495Execute file (which is looked for along $PATH) with arguments from
496args in a subprocess.
497If mode == P_NOWAIT return the pid of the process.
498If mode == P_WAIT return the process's exit code if it exits normally;
499otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000500 return _spawnvef(mode, file, args, None, execvp)
501
502 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000503 """spawnvpe(mode, file, args, env) -> integer
504
505Execute file (which is looked for along $PATH) with arguments from
506args in a subprocess with the supplied environment.
507If mode == P_NOWAIT return the pid of the process.
508If mode == P_WAIT return the process's exit code if it exits normally;
509otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000510 return _spawnvef(mode, file, args, env, execvpe)
511
512if _exists("spawnv"):
513 # These aren't supplied by the basic Windows code
514 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000515
516 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000517 """spawnl(mode, file, *args) -> integer
518
519Execute file with arguments from args in a subprocess.
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 spawnv(mode, file, args)
524
525 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000526 """spawnle(mode, file, *args, env) -> integer
527
528Execute file with arguments from args in a subprocess with the
529supplied 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 spawnve(mode, file, args[:-1], env)
535
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000536if _exists("spawnvp"):
537 # At the moment, Windows doesn't implement spawnvp[e],
538 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000539 def spawnlp(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000540 """spawnlp(mode, file, *args, env) -> integer
541
542Execute file (which is looked for along $PATH) with arguments from
543args in a subprocess with the supplied environment.
544If mode == P_NOWAIT return the pid of the process.
545If mode == P_WAIT return the process's exit code if it exits normally;
546otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000547 return spawnvp(mode, file, args)
548
549 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000550 """spawnlpe(mode, file, *args, env) -> integer
551
552Execute file (which is looked for along $PATH) with arguments from
553args in a subprocess with the supplied environment.
554If mode == P_NOWAIT return the pid of the process.
555If mode == P_WAIT return the process's exit code if it exits normally;
556otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000557 env = args[-1]
558 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000559
560
Skip Montanaro269b83b2001-02-06 01:07:02 +0000561 __all__.extend(["spawnlp","spawnlpe","spawnv", "spawnve","spawnvp",
562 "spawnvpe","spawnl","spawnle",])
563
564
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000565# Supply popen2 etc. (for Unix)
566if _exists("fork"):
567 if not _exists("popen2"):
568 def popen2(cmd, mode="t", bufsize=-1):
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000569 import popen2
570 stdout, stdin = popen2.popen2(cmd, bufsize)
571 return stdin, stdout
Skip Montanaro269b83b2001-02-06 01:07:02 +0000572 __all__.append("popen2")
Fred Drake31f182e2000-08-28 17:20:05 +0000573
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000574 if not _exists("popen3"):
575 def popen3(cmd, mode="t", bufsize=-1):
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000576 import popen2
577 stdout, stdin, stderr = popen2.popen3(cmd, bufsize)
578 return stdin, stdout, stderr
Skip Montanaro269b83b2001-02-06 01:07:02 +0000579 __all__.append("popen3")
Fred Drake20af3172000-09-28 19:10:56 +0000580
581 if not _exists("popen4"):
582 def popen4(cmd, mode="t", bufsize=-1):
583 import popen2
584 stdout, stdin = popen2.popen4(cmd, bufsize)
585 return stdin, stdout
Skip Montanaro269b83b2001-02-06 01:07:02 +0000586 __all__.append("popen4")