blob: 201aa9dc167340e8c0fb3466be7838c0e5982cd5 [file] [log] [blame]
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +00001"""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:
325 import tempfile
326 # Exec a file that is guaranteed not to exist
Guido van Rossum868b50a2000-04-26 20:32:08 +0000327 try: execv(tempfile.mktemp(), ('blah',))
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000328 except error, _notfound: pass
329 exc, arg = error, _notfound
330 for dir in PATH:
331 fullname = path.join(dir, file)
332 try:
333 apply(func, (fullname,) + argrest)
334 except error, (errno, msg):
335 if errno != arg[0]:
336 exc, arg = error, (errno, msg)
337 raise exc, arg
Guido van Rossum2979b011994-08-01 11:18:30 +0000338
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000339
340if name != "riscos":
341 # Change environ to automatically call putenv() if it exists
342 try:
343 # This will fail if there's no putenv
344 putenv
345 except NameError:
346 pass
347 else:
348 import UserDict
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000349
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000350 if name in ('os2', 'nt', 'dos'): # Where Env Var Names Must Be UPPERCASE
351 # But we store them as upper case
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000352 class _Environ(UserDict.UserDict):
353 def __init__(self, environ):
354 UserDict.UserDict.__init__(self)
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000355 data = self.data
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000356 for k, v in environ.items():
Guido van Rossum965fdae2000-04-04 19:50:04 +0000357 data[k.upper()] = v
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000358 def __setitem__(self, key, item):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000359 putenv(key, item)
Guido van Rossum965fdae2000-04-04 19:50:04 +0000360 self.data[key.upper()] = item
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000361 def __getitem__(self, key):
Guido van Rossum965fdae2000-04-04 19:50:04 +0000362 return self.data[key.upper()]
363 def __delitem__(self, key):
364 del self.data[key.upper()]
Guido van Rossumb46413f1999-05-03 15:23:24 +0000365 def has_key(self, key):
Guido van Rossum965fdae2000-04-04 19:50:04 +0000366 return self.data.has_key(key.upper())
367 def get(self, key, failobj=None):
368 return self.data.get(key.upper(), failobj)
369 def update(self, dict):
370 for k, v in dict.items():
371 self[k] = v
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000372
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000373 else: # Where Env Var Names Can Be Mixed Case
374 class _Environ(UserDict.UserDict):
375 def __init__(self, environ):
376 UserDict.UserDict.__init__(self)
377 self.data = environ
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000378 def __setitem__(self, key, item):
379 putenv(key, item)
380 self.data[key] = item
Guido van Rossum965fdae2000-04-04 19:50:04 +0000381 def update(self, dict):
382 for k, v in dict.items():
383 self[k] = v
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000384
385 environ = _Environ(environ)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000386
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000387 def getenv(key, default=None):
388 """Get an environment variable, return None if it doesn't exist.
389 The optional second argument can specify an alternate default."""
390 return environ.get(key, default)
391 __all__.append("getenv")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000392
393def _exists(name):
394 try:
395 eval(name)
396 return 1
397 except NameError:
398 return 0
399
400# Supply spawn*() (probably only for Unix)
401if _exists("fork") and not _exists("spawnv") and _exists("execv"):
402
403 P_WAIT = 0
404 P_NOWAIT = P_NOWAITO = 1
405
406 # XXX Should we support P_DETACH? I suppose it could fork()**2
407 # and close the std I/O streams. Also, P_OVERLAY is the same
408 # as execv*()?
409
410 def _spawnvef(mode, file, args, env, func):
411 # Internal helper; func is the exec*() function to use
412 pid = fork()
413 if not pid:
414 # Child
415 try:
416 if env is None:
417 func(file, args)
418 else:
419 func(file, args, env)
420 except:
421 _exit(127)
422 else:
423 # Parent
424 if mode == P_NOWAIT:
425 return pid # Caller is responsible for waiting!
426 while 1:
427 wpid, sts = waitpid(pid, 0)
428 if WIFSTOPPED(sts):
429 continue
430 elif WIFSIGNALED(sts):
431 return -WTERMSIG(sts)
432 elif WIFEXITED(sts):
433 return WEXITSTATUS(sts)
434 else:
435 raise error, "Not stopped, signaled or exited???"
436
437 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000438 """spawnv(mode, file, args) -> integer
439
440Execute file with arguments from args in a subprocess.
441If mode == P_NOWAIT return the pid of the process.
442If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000443otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000444 return _spawnvef(mode, file, args, None, execv)
445
446 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000447 """spawnve(mode, file, args, env) -> integer
448
449Execute file with arguments from args in a subprocess with the
450specified environment.
451If mode == P_NOWAIT return the pid of the process.
452If mode == P_WAIT return the process's exit code if it exits normally;
453otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000454 return _spawnvef(mode, file, args, env, execve)
455
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000456 # Note: spawnvp[e] is't currently supported on Windows
457
458 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000459 """spawnvp(mode, file, args) -> integer
460
461Execute file (which is looked for along $PATH) with arguments from
462args in a subprocess.
463If mode == P_NOWAIT return the pid of the process.
464If mode == P_WAIT return the process's exit code if it exits normally;
465otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000466 return _spawnvef(mode, file, args, None, execvp)
467
468 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000469 """spawnvpe(mode, file, args, env) -> integer
470
471Execute file (which is looked for along $PATH) with arguments from
472args in a subprocess with the supplied environment.
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, env, execvpe)
477
478if _exists("spawnv"):
479 # These aren't supplied by the basic Windows code
480 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000481
482 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000483 """spawnl(mode, file, *args) -> integer
484
485Execute file with arguments from args in a subprocess.
486If mode == P_NOWAIT return the pid of the process.
487If mode == P_WAIT return the process's exit code if it exits normally;
488otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000489 return spawnv(mode, file, args)
490
491 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000492 """spawnle(mode, file, *args, env) -> integer
493
494Execute file with arguments from args in a subprocess with the
495supplied environment.
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 env = args[-1]
500 return spawnve(mode, file, args[:-1], env)
501
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000502if _exists("spawnvp"):
503 # At the moment, Windows doesn't implement spawnvp[e],
504 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000505 def spawnlp(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000506 """spawnlp(mode, file, *args, env) -> integer
507
508Execute file (which is looked for along $PATH) with arguments from
509args in a subprocess with the supplied environment.
510If mode == P_NOWAIT return the pid of the process.
511If mode == P_WAIT return the process's exit code if it exits normally;
512otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000513 return spawnvp(mode, file, args)
514
515 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000516 """spawnlpe(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 env = args[-1]
524 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000525
526
Skip Montanaro269b83b2001-02-06 01:07:02 +0000527 __all__.extend(["spawnlp","spawnlpe","spawnv", "spawnve","spawnvp",
528 "spawnvpe","spawnl","spawnle",])
529
530
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000531# Supply popen2 etc. (for Unix)
532if _exists("fork"):
533 if not _exists("popen2"):
534 def popen2(cmd, mode="t", bufsize=-1):
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000535 import popen2
536 stdout, stdin = popen2.popen2(cmd, bufsize)
537 return stdin, stdout
Skip Montanaro269b83b2001-02-06 01:07:02 +0000538 __all__.append("popen2")
Fred Drake31f182e2000-08-28 17:20:05 +0000539
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000540 if not _exists("popen3"):
541 def popen3(cmd, mode="t", bufsize=-1):
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000542 import popen2
543 stdout, stdin, stderr = popen2.popen3(cmd, bufsize)
544 return stdin, stdout, stderr
Skip Montanaro269b83b2001-02-06 01:07:02 +0000545 __all__.append("popen3")
Fred Drake20af3172000-09-28 19:10:56 +0000546
547 if not _exists("popen4"):
548 def popen4(cmd, mode="t", bufsize=-1):
549 import popen2
550 stdout, stdin = popen2.popen4(cmd, bufsize)
551 return stdin, stdout
Skip Montanaro269b83b2001-02-06 01:07:02 +0000552 __all__.append("popen4")