blob: bf31ddcce0df47a045b9662382621d94a962bed6 [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 Rossume2ae77b2001-10-24 20:42:55 +000010 - os.extsep is the extension separator ('.' or '/')
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +000011 - os.altsep is the alternate pathname separator (None or '/')
Guido van Rossum54f22ed2000-02-04 15:10:34 +000012 - os.pathsep is the component separator used in $PATH etc
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +000013 - os.linesep is the line separator in text files ('\r' or '\n' or '\r\n')
Guido van Rossum54f22ed2000-02-04 15:10:34 +000014 - os.defpath is the default search path for executables
Guido van Rossum31104f41992-01-14 18:28:36 +000015
Guido van Rossum54f22ed2000-02-04 15:10:34 +000016Programs that import and use 'os' stand a better chance of being
17portable between different platforms. Of course, they must then
18only use functions that are defined by all platforms (e.g., unlink
19and opendir), and leave all pathname manipulation to os.path
20(e.g., split and join).
21"""
Guido van Rossum31104f41992-01-14 18:28:36 +000022
Skip Montanaro269b83b2001-02-06 01:07:02 +000023#'
24
Guido van Rossum2979b011994-08-01 11:18:30 +000025import sys
Guido van Rossuma28dab51997-08-29 22:36:47 +000026
27_names = sys.builtin_module_names
28
29altsep = None
30
Skip Montanaro6c0a0e12001-02-28 01:00:58 +000031__all__ = ["altsep", "curdir", "pardir", "sep", "pathsep", "linesep",
32 "defpath", "name"]
Skip Montanaro269b83b2001-02-06 01:07:02 +000033
34def _get_exports_list(module):
35 try:
36 return list(module.__all__)
37 except AttributeError:
38 return [n for n in dir(module) if n[0] != '_']
39
Guido van Rossuma28dab51997-08-29 22:36:47 +000040if 'posix' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000041 name = 'posix'
Guido van Rossume9387ea1998-05-22 15:26:04 +000042 linesep = '\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000043 curdir = '.'; pardir = '..'; sep = '/'; pathsep = ':'
44 defpath = ':/bin:/usr/bin'
45 from posix import *
46 try:
47 from posix import _exit
48 except ImportError:
49 pass
50 import posixpath
51 path = posixpath
52 del posixpath
Skip Montanaro269b83b2001-02-06 01:07:02 +000053
54 import posix
55 __all__.extend(_get_exports_list(posix))
56 del posix
57
Guido van Rossuma28dab51997-08-29 22:36:47 +000058elif 'nt' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000059 name = 'nt'
Guido van Rossume9387ea1998-05-22 15:26:04 +000060 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000061 curdir = '.'; pardir = '..'; sep = '\\'; pathsep = ';'
62 defpath = '.;C:\\bin'
63 from nt import *
Guido van Rossumfb801e71999-02-22 15:40:34 +000064 for i in ['_exit']:
Guido van Rossum67c65b21999-02-01 23:52:29 +000065 try:
66 exec "from nt import " + i
67 except ImportError:
68 pass
Guido van Rossum61de0ac1997-12-05 21:24:30 +000069 import ntpath
70 path = ntpath
71 del ntpath
Skip Montanaro269b83b2001-02-06 01:07:02 +000072
73 import nt
74 __all__.extend(_get_exports_list(nt))
75 del nt
76
Guido van Rossuma28dab51997-08-29 22:36:47 +000077elif 'dos' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000078 name = 'dos'
Guido van Rossume9387ea1998-05-22 15:26:04 +000079 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000080 curdir = '.'; pardir = '..'; sep = '\\'; pathsep = ';'
81 defpath = '.;C:\\bin'
82 from dos import *
83 try:
84 from dos import _exit
85 except ImportError:
86 pass
87 import dospath
88 path = dospath
89 del dospath
Skip Montanaro269b83b2001-02-06 01:07:02 +000090
91 import dos
92 __all__.extend(_get_exports_list(dos))
93 del dos
94
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000095elif 'os2' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000096 name = 'os2'
Guido van Rossume9387ea1998-05-22 15:26:04 +000097 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000098 curdir = '.'; pardir = '..'; sep = '\\'; pathsep = ';'
99 defpath = '.;C:\\bin'
100 from os2 import *
101 try:
102 from os2 import _exit
103 except ImportError:
104 pass
105 import ntpath
106 path = ntpath
107 del ntpath
Skip Montanaro269b83b2001-02-06 01:07:02 +0000108
109 import os2
110 __all__.extend(_get_exports_list(os2))
111 del os2
112
Guido van Rossuma28dab51997-08-29 22:36:47 +0000113elif 'mac' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000114 name = 'mac'
Guido van Rossume9387ea1998-05-22 15:26:04 +0000115 linesep = '\r'
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000116 curdir = ':'; pardir = '::'; sep = ':'; pathsep = '\n'
117 defpath = ':'
118 from mac import *
119 try:
120 from mac import _exit
121 except ImportError:
122 pass
123 import macpath
124 path = macpath
125 del macpath
Skip Montanaro269b83b2001-02-06 01:07:02 +0000126
127 import mac
128 __all__.extend(_get_exports_list(mac))
129 del mac
130
Guido van Rossum18df5d41999-06-11 01:37:27 +0000131elif 'ce' in _names:
132 name = 'ce'
133 linesep = '\r\n'
134 curdir = '.'; pardir = '..'; sep = '\\'; pathsep = ';'
135 defpath = '\\Windows'
136 from ce import *
137 for i in ['_exit']:
138 try:
139 exec "from ce import " + i
140 except ImportError:
141 pass
142 # We can use the standard Windows path.
143 import ntpath
144 path = ntpath
145 del ntpath
Skip Montanaro269b83b2001-02-06 01:07:02 +0000146
147 import ce
148 __all__.extend(_get_exports_list(ce))
149 del ce
150
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000151elif 'riscos' in _names:
152 name = 'riscos'
153 linesep = '\n'
154 curdir = '@'; pardir = '^'; sep = '.'; pathsep = ','
155 defpath = '<Run$Dir>'
156 from riscos import *
157 try:
158 from riscos import _exit
159 except ImportError:
160 pass
161 import riscospath
162 path = riscospath
163 del riscospath
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000164
165 import riscos
166 __all__.extend(_get_exports_list(riscos))
Skip Montanaro81e4b1c2001-03-06 15:26:07 +0000167 del riscos
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000168
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
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000172
173if sep=='.':
174 extsep = '/'
175else:
176 extsep = '.'
177
Skip Montanaro269b83b2001-02-06 01:07:02 +0000178__all__.append("path")
179
Guido van Rossuma28dab51997-08-29 22:36:47 +0000180del _names
181
Fred Drake02379091999-01-19 16:05:13 +0000182sys.modules['os.path'] = path
183
Skip Montanaro269b83b2001-02-06 01:07:02 +0000184#'
185
Guido van Rossum4def7de1998-07-24 20:48:03 +0000186# Super directory utilities.
187# (Inspired by Eric Raymond; the doc strings are mostly his)
188
189def makedirs(name, mode=0777):
190 """makedirs(path [, mode=0777]) -> None
191
192 Super-mkdir; create a leaf directory and all intermediate ones.
193 Works like mkdir, except that any intermediate path segment (not
194 just the rightmost) will be created if it does not exist. This is
195 recursive.
196
197 """
198 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000199 if not tail:
200 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000201 if head and tail and not path.exists(head):
202 makedirs(head, mode)
203 mkdir(name, mode)
204
205def removedirs(name):
206 """removedirs(path) -> None
207
208 Super-rmdir; remove a leaf directory and empty all intermediate
209 ones. Works like rmdir except that, if the leaf directory is
210 successfully removed, directories corresponding to rightmost path
211 segments will be pruned way until either the whole path is
212 consumed or an error occurs. Errors during this latter phase are
213 ignored -- they generally mean that a directory was not empty.
214
215 """
216 rmdir(name)
217 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000218 if not tail:
219 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000220 while head and tail:
221 try:
222 rmdir(head)
223 except error:
224 break
225 head, tail = path.split(head)
226
227def renames(old, new):
228 """renames(old, new) -> None
229
230 Super-rename; create directories as necessary and delete any left
231 empty. Works like rename, except creation of any intermediate
232 directories needed to make the new pathname good is attempted
233 first. After the rename, directories corresponding to rightmost
234 path segments of the old name will be pruned way until either the
235 whole path is consumed or a nonempty directory is found.
236
237 Note: this function can fail with the new directory structure made
238 if you lack permissions needed to unlink the leaf directory or
239 file.
240
241 """
242 head, tail = path.split(new)
243 if head and tail and not path.exists(head):
244 makedirs(head)
245 rename(old, new)
246 head, tail = path.split(old)
247 if head and tail:
248 try:
249 removedirs(head)
250 except error:
251 pass
252
Skip Montanaro269b83b2001-02-06 01:07:02 +0000253__all__.extend(["makedirs", "removedirs", "renames"])
254
Guido van Rossuma28dab51997-08-29 22:36:47 +0000255# Make sure os.environ exists, at least
256try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000257 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000258except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000259 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000260
Guido van Rossume65cce51993-11-08 15:05:21 +0000261def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000262 """execl(file, *args)
263
264 Execute the executable file with argument list args, replacing the
265 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000266 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000267
268def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000269 """execle(file, *args, env)
270
271 Execute the executable file with argument list args and
272 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000273 env = args[-1]
274 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000275
276def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000277 """execlp(file, *args)
278
279 Execute the executable file (which is searched for along $PATH)
280 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000281 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000282
Guido van Rossum030afb11995-03-14 17:27:18 +0000283def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000284 """execlpe(file, *args, env)
285
286 Execute the executable file (which is searched for along $PATH)
287 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000288 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000289 env = args[-1]
290 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000291
Guido van Rossume65cce51993-11-08 15:05:21 +0000292def execvp(file, args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000293 """execp(file, args)
294
295 Execute the executable file (which is searched for along $PATH)
296 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000297 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000298 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000299
300def execvpe(file, args, env):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000301 """execv(file, args, env)
302
303 Execute the executable file (which is searched for along $PATH)
304 with argument list args and environment env , replacing the
305 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000306 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000307 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000308
Skip Montanaro269b83b2001-02-06 01:07:02 +0000309__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
310
Guido van Rossum030afb11995-03-14 17:27:18 +0000311_notfound = None
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000312def _execvpe(file, args, env=None):
313 if env is not None:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000314 func = execve
315 argrest = (args, env)
316 else:
317 func = execv
318 argrest = (args,)
319 env = environ
320 global _notfound
321 head, tail = path.split(file)
322 if head:
323 apply(func, (file,) + argrest)
324 return
325 if env.has_key('PATH'):
326 envpath = env['PATH']
327 else:
328 envpath = defpath
Guido van Rossum965fdae2000-04-04 19:50:04 +0000329 PATH = envpath.split(pathsep)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000330 if not _notfound:
Guido van Rossumb7fe4322001-03-02 07:04:51 +0000331 if sys.platform[:4] == 'beos':
332 # Process handling (fork, wait) under BeOS (up to 5.0)
333 # doesn't interoperate reliably with the thread interlocking
334 # that happens during an import. The actual error we need
335 # is the same on BeOS for posix.open() et al., ENOENT.
336 try: unlink('/_#.# ## #.#')
337 except error, _notfound: pass
338 else:
339 import tempfile
340 t = tempfile.mktemp()
341 # Exec a file that is guaranteed not to exist
342 try: execv(t, ('blah',))
343 except error, _notfound: pass
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000344 exc, arg = error, _notfound
345 for dir in PATH:
346 fullname = path.join(dir, file)
347 try:
348 apply(func, (fullname,) + argrest)
349 except error, (errno, msg):
350 if errno != arg[0]:
351 exc, arg = error, (errno, msg)
352 raise exc, arg
Guido van Rossum2979b011994-08-01 11:18:30 +0000353
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000354
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000355# Change environ to automatically call putenv() if it exists
356try:
357 # This will fail if there's no putenv
358 putenv
359except NameError:
360 pass
361else:
362 import UserDict
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000363
Guido van Rossumc524d952001-10-19 01:31:59 +0000364 # Fake unsetenv() for Windows
Tim Peters1633a2e2001-10-30 05:56:40 +0000365 # not sure about os2 and dos here but
Guido van Rossumc524d952001-10-19 01:31:59 +0000366 # I'm guessing they are the same.
367
368 if name in ('os2', 'nt', 'dos'):
369 def unsetenv(key):
370 putenv(key, "")
371
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000372 if name == "riscos":
373 # On RISC OS, all env access goes through getenv and putenv
374 from riscosenviron import _Environ
375 elif name in ('os2', 'nt', 'dos'): # Where Env Var Names Must Be UPPERCASE
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000376 # But we store them as upper case
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000377 class _Environ(UserDict.UserDict):
378 def __init__(self, environ):
379 UserDict.UserDict.__init__(self)
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000380 data = self.data
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000381 for k, v in environ.items():
Guido van Rossum965fdae2000-04-04 19:50:04 +0000382 data[k.upper()] = v
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000383 def __setitem__(self, key, item):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000384 putenv(key, item)
Guido van Rossum965fdae2000-04-04 19:50:04 +0000385 self.data[key.upper()] = item
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000386 def __getitem__(self, key):
Guido van Rossum965fdae2000-04-04 19:50:04 +0000387 return self.data[key.upper()]
Guido van Rossumc524d952001-10-19 01:31:59 +0000388 try:
389 unsetenv
390 except NameError:
391 def __delitem__(self, key):
392 del self.data[key.upper()]
393 else:
394 def __delitem__(self, key):
395 unsetenv(key)
396 del self.data[key.upper()]
Guido van Rossumb46413f1999-05-03 15:23:24 +0000397 def has_key(self, key):
Guido van Rossum965fdae2000-04-04 19:50:04 +0000398 return self.data.has_key(key.upper())
399 def get(self, key, failobj=None):
400 return self.data.get(key.upper(), failobj)
401 def update(self, dict):
402 for k, v in dict.items():
403 self[k] = v
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000404
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000405 else: # Where Env Var Names Can Be Mixed Case
406 class _Environ(UserDict.UserDict):
407 def __init__(self, environ):
408 UserDict.UserDict.__init__(self)
409 self.data = environ
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000410 def __setitem__(self, key, item):
411 putenv(key, item)
412 self.data[key] = item
Guido van Rossum965fdae2000-04-04 19:50:04 +0000413 def update(self, dict):
414 for k, v in dict.items():
415 self[k] = v
Guido van Rossumc524d952001-10-19 01:31:59 +0000416 try:
417 unsetenv
418 except NameError:
419 pass
420 else:
421 def __delitem__(self, key):
422 unsetenv(key)
423 del self.data[key]
Tim Peters1633a2e2001-10-30 05:56:40 +0000424
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000425
426 environ = _Environ(environ)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000427
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000428 def getenv(key, default=None):
429 """Get an environment variable, return None if it doesn't exist.
430 The optional second argument can specify an alternate default."""
431 return environ.get(key, default)
432 __all__.append("getenv")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000433
434def _exists(name):
435 try:
436 eval(name)
437 return 1
438 except NameError:
439 return 0
440
441# Supply spawn*() (probably only for Unix)
442if _exists("fork") and not _exists("spawnv") and _exists("execv"):
443
444 P_WAIT = 0
445 P_NOWAIT = P_NOWAITO = 1
446
447 # XXX Should we support P_DETACH? I suppose it could fork()**2
448 # and close the std I/O streams. Also, P_OVERLAY is the same
449 # as execv*()?
450
451 def _spawnvef(mode, file, args, env, func):
452 # Internal helper; func is the exec*() function to use
453 pid = fork()
454 if not pid:
455 # Child
456 try:
457 if env is None:
458 func(file, args)
459 else:
460 func(file, args, env)
461 except:
462 _exit(127)
463 else:
464 # Parent
465 if mode == P_NOWAIT:
466 return pid # Caller is responsible for waiting!
467 while 1:
468 wpid, sts = waitpid(pid, 0)
469 if WIFSTOPPED(sts):
470 continue
471 elif WIFSIGNALED(sts):
472 return -WTERMSIG(sts)
473 elif WIFEXITED(sts):
474 return WEXITSTATUS(sts)
475 else:
476 raise error, "Not stopped, signaled or exited???"
477
478 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000479 """spawnv(mode, file, args) -> integer
480
481Execute file with arguments from args in a subprocess.
482If mode == P_NOWAIT return the pid of the process.
483If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000484otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000485 return _spawnvef(mode, file, args, None, execv)
486
487 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000488 """spawnve(mode, file, args, env) -> integer
489
490Execute file with arguments from args in a subprocess with the
491specified environment.
492If mode == P_NOWAIT return the pid of the process.
493If mode == P_WAIT return the process's exit code if it exits normally;
494otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000495 return _spawnvef(mode, file, args, env, execve)
496
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000497 # Note: spawnvp[e] is't currently supported on Windows
498
499 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000500 """spawnvp(mode, file, args) -> integer
501
502Execute file (which is looked for along $PATH) with arguments from
503args in a subprocess.
504If mode == P_NOWAIT return the pid of the process.
505If mode == P_WAIT return the process's exit code if it exits normally;
506otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000507 return _spawnvef(mode, file, args, None, execvp)
508
509 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000510 """spawnvpe(mode, file, args, env) -> integer
511
512Execute file (which is looked for along $PATH) with arguments from
513args in a subprocess with the supplied environment.
514If mode == P_NOWAIT return the pid of the process.
515If mode == P_WAIT return the process's exit code if it exits normally;
516otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000517 return _spawnvef(mode, file, args, env, execvpe)
518
519if _exists("spawnv"):
520 # These aren't supplied by the basic Windows code
521 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000522
523 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000524 """spawnl(mode, file, *args) -> integer
525
526Execute file with arguments from args in a subprocess.
527If mode == P_NOWAIT return the pid of the process.
528If mode == P_WAIT return the process's exit code if it exits normally;
529otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000530 return spawnv(mode, file, args)
531
532 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000533 """spawnle(mode, file, *args, env) -> integer
534
535Execute file with arguments from args in a subprocess with the
536supplied environment.
537If mode == P_NOWAIT return the pid of the process.
538If mode == P_WAIT return the process's exit code if it exits normally;
539otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000540 env = args[-1]
541 return spawnve(mode, file, args[:-1], env)
542
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000543if _exists("spawnvp"):
544 # At the moment, Windows doesn't implement spawnvp[e],
545 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000546 def spawnlp(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000547 """spawnlp(mode, file, *args, env) -> integer
548
549Execute file (which is looked for along $PATH) with arguments from
550args in a subprocess with the supplied environment.
551If mode == P_NOWAIT return the pid of the process.
552If mode == P_WAIT return the process's exit code if it exits normally;
553otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000554 return spawnvp(mode, file, args)
555
556 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000557 """spawnlpe(mode, file, *args, env) -> integer
558
559Execute file (which is looked for along $PATH) with arguments from
560args in a subprocess with the supplied environment.
561If mode == P_NOWAIT return the pid of the process.
562If mode == P_WAIT return the process's exit code if it exits normally;
563otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000564 env = args[-1]
565 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000566
567
Skip Montanaro269b83b2001-02-06 01:07:02 +0000568 __all__.extend(["spawnlp","spawnlpe","spawnv", "spawnve","spawnvp",
569 "spawnvpe","spawnl","spawnle",])
570
571
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000572# Supply popen2 etc. (for Unix)
573if _exists("fork"):
574 if not _exists("popen2"):
575 def popen2(cmd, mode="t", bufsize=-1):
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000576 import popen2
577 stdout, stdin = popen2.popen2(cmd, bufsize)
578 return stdin, stdout
Skip Montanaro269b83b2001-02-06 01:07:02 +0000579 __all__.append("popen2")
Fred Drake31f182e2000-08-28 17:20:05 +0000580
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000581 if not _exists("popen3"):
582 def popen3(cmd, mode="t", bufsize=-1):
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000583 import popen2
584 stdout, stdin, stderr = popen2.popen3(cmd, bufsize)
585 return stdin, stdout, stderr
Skip Montanaro269b83b2001-02-06 01:07:02 +0000586 __all__.append("popen3")
Fred Drake20af3172000-09-28 19:10:56 +0000587
588 if not _exists("popen4"):
589 def popen4(cmd, mode="t", bufsize=-1):
590 import popen2
591 stdout, stdin = popen2.popen4(cmd, bufsize)
592 return stdin, stdout
Skip Montanaro269b83b2001-02-06 01:07:02 +0000593 __all__.append("popen4")