blob: e3b77616fd1c7b329d32136a558a04f51080952b [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:
Martin v. Löwis8b10f892002-10-09 17:23:29 +00004 - all functions from posix, nt, os2, mac, or ce, e.g. unlink, stat, etc.
5 - os.path is one of the modules posixpath, ntpath, or macpath
6 - os.name is 'posix', 'nt', '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 *
Tim Peters6757c1e2003-01-08 21:20:57 +000064 try:
65 from nt import _exit
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 Rossum8e9ebfd1997-11-22 21:53:48 +000076elif 'os2' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000077 name = 'os2'
Guido van Rossume9387ea1998-05-22 15:26:04 +000078 linesep = '\r\n'
Andrew MacIntyre5cef5712002-02-24 05:32:32 +000079 curdir = '.'; pardir = '..'; pathsep = ';'
80 if sys.version.find('EMX GCC') == -1:
81 # standard OS/2 compiler (VACPP or Watcom?)
82 sep = '\\'; altsep = '/'
83 else:
84 # EMX
85 sep = '/'; altsep = '\\'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000086 defpath = '.;C:\\bin'
87 from os2 import *
88 try:
89 from os2 import _exit
90 except ImportError:
91 pass
Andrew MacIntyre5cef5712002-02-24 05:32:32 +000092 if sys.version.find('EMX GCC') == -1:
93 import ntpath
94 path = ntpath
95 del ntpath
96 else:
97 import os2emxpath
98 path = os2emxpath
99 del os2emxpath
Skip Montanaro269b83b2001-02-06 01:07:02 +0000100
101 import os2
102 __all__.extend(_get_exports_list(os2))
103 del os2
104
Guido van Rossuma28dab51997-08-29 22:36:47 +0000105elif 'mac' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000106 name = 'mac'
Guido van Rossume9387ea1998-05-22 15:26:04 +0000107 linesep = '\r'
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000108 curdir = ':'; pardir = '::'; sep = ':'; pathsep = '\n'
109 defpath = ':'
110 from mac import *
111 try:
112 from mac import _exit
113 except ImportError:
114 pass
115 import macpath
116 path = macpath
117 del macpath
Skip Montanaro269b83b2001-02-06 01:07:02 +0000118
119 import mac
120 __all__.extend(_get_exports_list(mac))
121 del mac
122
Guido van Rossum18df5d41999-06-11 01:37:27 +0000123elif 'ce' in _names:
124 name = 'ce'
125 linesep = '\r\n'
126 curdir = '.'; pardir = '..'; sep = '\\'; pathsep = ';'
127 defpath = '\\Windows'
128 from ce import *
Tim Peters6757c1e2003-01-08 21:20:57 +0000129 try:
130 from ce import _exit
131 except ImportError:
132 pass
Guido van Rossum18df5d41999-06-11 01:37:27 +0000133 # We can use the standard Windows path.
134 import ntpath
135 path = ntpath
136 del ntpath
Skip Montanaro269b83b2001-02-06 01:07:02 +0000137
138 import ce
139 __all__.extend(_get_exports_list(ce))
140 del ce
141
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000142elif 'riscos' in _names:
143 name = 'riscos'
144 linesep = '\n'
145 curdir = '@'; pardir = '^'; sep = '.'; pathsep = ','
146 defpath = '<Run$Dir>'
147 from riscos import *
148 try:
149 from riscos import _exit
150 except ImportError:
151 pass
152 import riscospath
153 path = riscospath
154 del riscospath
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000155
156 import riscos
157 __all__.extend(_get_exports_list(riscos))
Skip Montanaro81e4b1c2001-03-06 15:26:07 +0000158 del riscos
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000159
Guido van Rossum2979b011994-08-01 11:18:30 +0000160else:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000161 raise ImportError, 'no os specific module found'
Guido van Rossume65cce51993-11-08 15:05:21 +0000162
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000163
164if sep=='.':
165 extsep = '/'
166else:
167 extsep = '.'
168
Skip Montanaro269b83b2001-02-06 01:07:02 +0000169__all__.append("path")
170
Guido van Rossuma28dab51997-08-29 22:36:47 +0000171del _names
172
Fred Drake02379091999-01-19 16:05:13 +0000173sys.modules['os.path'] = path
174
Skip Montanaro269b83b2001-02-06 01:07:02 +0000175#'
176
Guido van Rossum4def7de1998-07-24 20:48:03 +0000177# Super directory utilities.
178# (Inspired by Eric Raymond; the doc strings are mostly his)
179
180def makedirs(name, mode=0777):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000181 """makedirs(path [, mode=0777])
Guido van Rossum4def7de1998-07-24 20:48:03 +0000182
183 Super-mkdir; create a leaf directory and all intermediate ones.
184 Works like mkdir, except that any intermediate path segment (not
185 just the rightmost) will be created if it does not exist. This is
186 recursive.
187
188 """
189 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000190 if not tail:
191 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000192 if head and tail and not path.exists(head):
193 makedirs(head, mode)
194 mkdir(name, mode)
195
196def removedirs(name):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000197 """removedirs(path)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000198
199 Super-rmdir; remove a leaf directory and empty all intermediate
200 ones. Works like rmdir except that, if the leaf directory is
201 successfully removed, directories corresponding to rightmost path
202 segments will be pruned way until either the whole path is
203 consumed or an error occurs. Errors during this latter phase are
204 ignored -- they generally mean that a directory was not empty.
205
206 """
207 rmdir(name)
208 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000209 if not tail:
210 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000211 while head and tail:
212 try:
213 rmdir(head)
214 except error:
215 break
216 head, tail = path.split(head)
217
218def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000219 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000220
221 Super-rename; create directories as necessary and delete any left
222 empty. Works like rename, except creation of any intermediate
223 directories needed to make the new pathname good is attempted
224 first. After the rename, directories corresponding to rightmost
225 path segments of the old name will be pruned way until either the
226 whole path is consumed or a nonempty directory is found.
227
228 Note: this function can fail with the new directory structure made
229 if you lack permissions needed to unlink the leaf directory or
230 file.
231
232 """
233 head, tail = path.split(new)
234 if head and tail and not path.exists(head):
235 makedirs(head)
236 rename(old, new)
237 head, tail = path.split(old)
238 if head and tail:
239 try:
240 removedirs(head)
241 except error:
242 pass
243
Skip Montanaro269b83b2001-02-06 01:07:02 +0000244__all__.extend(["makedirs", "removedirs", "renames"])
245
Guido van Rossuma28dab51997-08-29 22:36:47 +0000246# Make sure os.environ exists, at least
247try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000248 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000249except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000250 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000251
Guido van Rossume65cce51993-11-08 15:05:21 +0000252def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000253 """execl(file, *args)
254
255 Execute the executable file with argument list args, replacing the
256 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000257 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000258
259def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000260 """execle(file, *args, env)
261
262 Execute the executable file with argument list args and
263 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000264 env = args[-1]
265 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000266
267def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000268 """execlp(file, *args)
269
270 Execute the executable file (which is searched for along $PATH)
271 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000272 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000273
Guido van Rossum030afb11995-03-14 17:27:18 +0000274def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000275 """execlpe(file, *args, env)
276
277 Execute the executable file (which is searched for along $PATH)
278 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000279 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000280 env = args[-1]
281 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000282
Guido van Rossume65cce51993-11-08 15:05:21 +0000283def execvp(file, args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000284 """execp(file, args)
285
286 Execute the executable file (which is searched for along $PATH)
287 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000288 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000289 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000290
291def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000292 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000293
294 Execute the executable file (which is searched for along $PATH)
295 with argument list args and environment env , replacing the
296 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000297 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000298 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000299
Skip Montanaro269b83b2001-02-06 01:07:02 +0000300__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
301
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000302def _execvpe(file, args, env=None):
Guido van Rossumaed51d82002-08-05 16:13:24 +0000303 from errno import ENOENT, ENOTDIR
304
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000305 if env is not None:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000306 func = execve
307 argrest = (args, env)
308 else:
309 func = execv
310 argrest = (args,)
311 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000312
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000313 head, tail = path.split(file)
314 if head:
315 apply(func, (file,) + argrest)
316 return
Raymond Hettinger54f02222002-06-01 14:18:47 +0000317 if 'PATH' in env:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000318 envpath = env['PATH']
319 else:
320 envpath = defpath
Guido van Rossum965fdae2000-04-04 19:50:04 +0000321 PATH = envpath.split(pathsep)
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000322 saved_exc = None
323 saved_tb = None
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000324 for dir in PATH:
325 fullname = path.join(dir, file)
326 try:
327 apply(func, (fullname,) + argrest)
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000328 except error, e:
329 tb = sys.exc_info()[2]
330 if (e.errno != ENOENT and e.errno != ENOTDIR
331 and saved_exc is None):
332 saved_exc = e
333 saved_tb = tb
334 if saved_exc:
335 raise error, saved_exc, saved_tb
336 raise error, e, tb
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000337
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000338# Change environ to automatically call putenv() if it exists
339try:
340 # This will fail if there's no putenv
341 putenv
342except NameError:
343 pass
344else:
345 import UserDict
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000346
Guido van Rossumc524d952001-10-19 01:31:59 +0000347 # Fake unsetenv() for Windows
Martin v. Löwis8b10f892002-10-09 17:23:29 +0000348 # not sure about os2 here but
Guido van Rossumc524d952001-10-19 01:31:59 +0000349 # I'm guessing they are the same.
350
Martin v. Löwis8b10f892002-10-09 17:23:29 +0000351 if name in ('os2', 'nt'):
Guido van Rossumc524d952001-10-19 01:31:59 +0000352 def unsetenv(key):
353 putenv(key, "")
354
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000355 if name == "riscos":
356 # On RISC OS, all env access goes through getenv and putenv
357 from riscosenviron import _Environ
Martin v. Löwis8b10f892002-10-09 17:23:29 +0000358 elif name in ('os2', 'nt'): # Where Env Var Names Must Be UPPERCASE
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000359 # But we store them as upper case
Raymond Hettingerca2f5372002-09-06 19:36:31 +0000360 class _Environ(UserDict.IterableUserDict):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000361 def __init__(self, environ):
362 UserDict.UserDict.__init__(self)
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000363 data = self.data
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000364 for k, v in environ.items():
Guido van Rossum965fdae2000-04-04 19:50:04 +0000365 data[k.upper()] = v
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000366 def __setitem__(self, key, item):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000367 putenv(key, item)
Guido van Rossum965fdae2000-04-04 19:50:04 +0000368 self.data[key.upper()] = item
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000369 def __getitem__(self, key):
Guido van Rossum965fdae2000-04-04 19:50:04 +0000370 return self.data[key.upper()]
Guido van Rossumc524d952001-10-19 01:31:59 +0000371 try:
372 unsetenv
373 except NameError:
374 def __delitem__(self, key):
375 del self.data[key.upper()]
376 else:
377 def __delitem__(self, key):
378 unsetenv(key)
379 del self.data[key.upper()]
Guido van Rossumb46413f1999-05-03 15:23:24 +0000380 def has_key(self, key):
Raymond Hettinger54f02222002-06-01 14:18:47 +0000381 return key.upper() in self.data
382 def __contains__(self, key):
383 return key.upper() in self.data
Guido van Rossum965fdae2000-04-04 19:50:04 +0000384 def get(self, key, failobj=None):
385 return self.data.get(key.upper(), failobj)
386 def update(self, dict):
387 for k, v in dict.items():
388 self[k] = v
Martin v. Löwisa066f462002-05-02 17:39:19 +0000389 def copy(self):
390 return dict(self)
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000391
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000392 else: # Where Env Var Names Can Be Mixed Case
Raymond Hettinger05212fc2002-09-07 04:48:03 +0000393 class _Environ(UserDict.IterableUserDict):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000394 def __init__(self, environ):
395 UserDict.UserDict.__init__(self)
396 self.data = environ
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000397 def __setitem__(self, key, item):
398 putenv(key, item)
399 self.data[key] = item
Guido van Rossum965fdae2000-04-04 19:50:04 +0000400 def update(self, dict):
401 for k, v in dict.items():
402 self[k] = v
Guido van Rossumc524d952001-10-19 01:31:59 +0000403 try:
404 unsetenv
405 except NameError:
406 pass
407 else:
408 def __delitem__(self, key):
409 unsetenv(key)
410 del self.data[key]
Martin v. Löwisa066f462002-05-02 17:39:19 +0000411 def copy(self):
412 return dict(self)
Tim Peters1633a2e2001-10-30 05:56:40 +0000413
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000414
415 environ = _Environ(environ)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000416
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000417def getenv(key, default=None):
Tim Peters2c60f7a2003-01-29 03:49:43 +0000418 """Get an environment variable, return None if it doesn't exist.
419 The optional second argument can specify an alternate default."""
420 return environ.get(key, default)
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000421__all__.append("getenv")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000422
423def _exists(name):
424 try:
425 eval(name)
Tim Petersbc0e9102002-04-04 22:55:58 +0000426 return True
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000427 except NameError:
Tim Petersbc0e9102002-04-04 22:55:58 +0000428 return False
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000429
430# Supply spawn*() (probably only for Unix)
431if _exists("fork") and not _exists("spawnv") and _exists("execv"):
432
433 P_WAIT = 0
434 P_NOWAIT = P_NOWAITO = 1
435
436 # XXX Should we support P_DETACH? I suppose it could fork()**2
437 # and close the std I/O streams. Also, P_OVERLAY is the same
438 # as execv*()?
439
440 def _spawnvef(mode, file, args, env, func):
441 # Internal helper; func is the exec*() function to use
442 pid = fork()
443 if not pid:
444 # Child
445 try:
446 if env is None:
447 func(file, args)
448 else:
449 func(file, args, env)
450 except:
451 _exit(127)
452 else:
453 # Parent
454 if mode == P_NOWAIT:
455 return pid # Caller is responsible for waiting!
456 while 1:
457 wpid, sts = waitpid(pid, 0)
458 if WIFSTOPPED(sts):
459 continue
460 elif WIFSIGNALED(sts):
461 return -WTERMSIG(sts)
462 elif WIFEXITED(sts):
463 return WEXITSTATUS(sts)
464 else:
465 raise error, "Not stopped, signaled or exited???"
466
467 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000468 """spawnv(mode, file, args) -> integer
469
470Execute file with arguments from args in a subprocess.
471If mode == P_NOWAIT return the pid of the process.
472If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000473otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000474 return _spawnvef(mode, file, args, None, execv)
475
476 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000477 """spawnve(mode, file, args, env) -> integer
478
479Execute file with arguments from args in a subprocess with the
480specified environment.
481If mode == P_NOWAIT return the pid of the process.
482If mode == P_WAIT return the process's exit code if it exits normally;
483otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000484 return _spawnvef(mode, file, args, env, execve)
485
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000486 # Note: spawnvp[e] is't currently supported on Windows
487
488 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000489 """spawnvp(mode, file, args) -> integer
490
491Execute file (which is looked for along $PATH) with arguments from
492args in a subprocess.
493If mode == P_NOWAIT return the pid of the process.
494If mode == P_WAIT return the process's exit code if it exits normally;
495otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000496 return _spawnvef(mode, file, args, None, execvp)
497
498 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000499 """spawnvpe(mode, file, args, env) -> integer
500
501Execute file (which is looked for along $PATH) with arguments from
502args in a subprocess with the supplied environment.
503If mode == P_NOWAIT return the pid of the process.
504If mode == P_WAIT return the process's exit code if it exits normally;
505otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000506 return _spawnvef(mode, file, args, env, execvpe)
507
508if _exists("spawnv"):
509 # These aren't supplied by the basic Windows code
510 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000511
512 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000513 """spawnl(mode, file, *args) -> integer
514
515Execute file with arguments from args in a subprocess.
516If mode == P_NOWAIT return the pid of the process.
517If mode == P_WAIT return the process's exit code if it exits normally;
518otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000519 return spawnv(mode, file, args)
520
521 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000522 """spawnle(mode, file, *args, env) -> integer
523
524Execute file with arguments from args in a subprocess with the
525supplied environment.
526If mode == P_NOWAIT return the pid of the process.
527If mode == P_WAIT return the process's exit code if it exits normally;
528otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000529 env = args[-1]
530 return spawnve(mode, file, args[:-1], env)
531
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000532if _exists("spawnvp"):
533 # At the moment, Windows doesn't implement spawnvp[e],
534 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000535 def spawnlp(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000536 """spawnlp(mode, file, *args, env) -> integer
537
538Execute file (which is looked for along $PATH) with arguments from
539args in a subprocess with the supplied environment.
540If mode == P_NOWAIT return the pid of the process.
541If mode == P_WAIT return the process's exit code if it exits normally;
542otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000543 return spawnvp(mode, file, args)
544
545 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000546 """spawnlpe(mode, file, *args, env) -> integer
547
548Execute file (which is looked for along $PATH) with arguments from
549args in a subprocess with the supplied environment.
550If mode == P_NOWAIT return the pid of the process.
551If mode == P_WAIT return the process's exit code if it exits normally;
552otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000553 env = args[-1]
554 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000555
556
Skip Montanaro269b83b2001-02-06 01:07:02 +0000557 __all__.extend(["spawnlp","spawnlpe","spawnv", "spawnve","spawnvp",
558 "spawnvpe","spawnl","spawnle",])
559
560
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000561# Supply popen2 etc. (for Unix)
562if _exists("fork"):
563 if not _exists("popen2"):
564 def popen2(cmd, mode="t", bufsize=-1):
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000565 import popen2
566 stdout, stdin = popen2.popen2(cmd, bufsize)
567 return stdin, stdout
Skip Montanaro269b83b2001-02-06 01:07:02 +0000568 __all__.append("popen2")
Fred Drake31f182e2000-08-28 17:20:05 +0000569
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000570 if not _exists("popen3"):
571 def popen3(cmd, mode="t", bufsize=-1):
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000572 import popen2
573 stdout, stdin, stderr = popen2.popen3(cmd, bufsize)
574 return stdin, stdout, stderr
Skip Montanaro269b83b2001-02-06 01:07:02 +0000575 __all__.append("popen3")
Fred Drake20af3172000-09-28 19:10:56 +0000576
577 if not _exists("popen4"):
578 def popen4(cmd, mode="t", bufsize=-1):
579 import popen2
580 stdout, stdin = popen2.popen4(cmd, bufsize)
581 return stdin, stdout
Skip Montanaro269b83b2001-02-06 01:07:02 +0000582 __all__.append("popen4")
Michael W. Hudson0e025302002-03-06 17:11:18 +0000583
584import copy_reg as _copy_reg
585
586def _make_stat_result(tup, dict):
587 return stat_result(tup, dict)
588
589def _pickle_stat_result(sr):
590 (type, args) = sr.__reduce__()
591 return (_make_stat_result, args)
592
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000593try:
594 _copy_reg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
595except NameError: # stat_result may not exist
596 pass
Michael W. Hudson0e025302002-03-06 17:11:18 +0000597
598def _make_statvfs_result(tup, dict):
599 return statvfs_result(tup, dict)
600
601def _pickle_statvfs_result(sr):
602 (type, args) = sr.__reduce__()
603 return (_make_statvfs_result, args)
604
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000605try:
606 _copy_reg.pickle(statvfs_result, _pickle_statvfs_result,
607 _make_statvfs_result)
Michael W. Hudsone5363b72002-03-15 10:21:59 +0000608except NameError: # statvfs_result may not exist
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000609 pass