blob: a2daba81b7fd863c8a7bbba3f4ba9f8a723c772a [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'
Andrew MacIntyre5cef5712002-02-24 05:32:32 +000098 curdir = '.'; pardir = '..'; pathsep = ';'
99 if sys.version.find('EMX GCC') == -1:
100 # standard OS/2 compiler (VACPP or Watcom?)
101 sep = '\\'; altsep = '/'
102 else:
103 # EMX
104 sep = '/'; altsep = '\\'
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000105 defpath = '.;C:\\bin'
106 from os2 import *
107 try:
108 from os2 import _exit
109 except ImportError:
110 pass
Andrew MacIntyre5cef5712002-02-24 05:32:32 +0000111 if sys.version.find('EMX GCC') == -1:
112 import ntpath
113 path = ntpath
114 del ntpath
115 else:
116 import os2emxpath
117 path = os2emxpath
118 del os2emxpath
Skip Montanaro269b83b2001-02-06 01:07:02 +0000119
120 import os2
121 __all__.extend(_get_exports_list(os2))
122 del os2
123
Guido van Rossuma28dab51997-08-29 22:36:47 +0000124elif 'mac' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000125 name = 'mac'
Guido van Rossume9387ea1998-05-22 15:26:04 +0000126 linesep = '\r'
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000127 curdir = ':'; pardir = '::'; sep = ':'; pathsep = '\n'
128 defpath = ':'
129 from mac import *
130 try:
131 from mac import _exit
132 except ImportError:
133 pass
134 import macpath
135 path = macpath
136 del macpath
Skip Montanaro269b83b2001-02-06 01:07:02 +0000137
138 import mac
139 __all__.extend(_get_exports_list(mac))
140 del mac
141
Guido van Rossum18df5d41999-06-11 01:37:27 +0000142elif 'ce' in _names:
143 name = 'ce'
144 linesep = '\r\n'
145 curdir = '.'; pardir = '..'; sep = '\\'; pathsep = ';'
146 defpath = '\\Windows'
147 from ce import *
148 for i in ['_exit']:
149 try:
150 exec "from ce import " + i
151 except ImportError:
152 pass
153 # We can use the standard Windows path.
154 import ntpath
155 path = ntpath
156 del ntpath
Skip Montanaro269b83b2001-02-06 01:07:02 +0000157
158 import ce
159 __all__.extend(_get_exports_list(ce))
160 del ce
161
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000162elif 'riscos' in _names:
163 name = 'riscos'
164 linesep = '\n'
165 curdir = '@'; pardir = '^'; sep = '.'; pathsep = ','
166 defpath = '<Run$Dir>'
167 from riscos import *
168 try:
169 from riscos import _exit
170 except ImportError:
171 pass
172 import riscospath
173 path = riscospath
174 del riscospath
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000175
176 import riscos
177 __all__.extend(_get_exports_list(riscos))
Skip Montanaro81e4b1c2001-03-06 15:26:07 +0000178 del riscos
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000179
Guido van Rossum2979b011994-08-01 11:18:30 +0000180else:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000181 raise ImportError, 'no os specific module found'
Guido van Rossume65cce51993-11-08 15:05:21 +0000182
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000183
184if sep=='.':
185 extsep = '/'
186else:
187 extsep = '.'
188
Skip Montanaro269b83b2001-02-06 01:07:02 +0000189__all__.append("path")
190
Guido van Rossuma28dab51997-08-29 22:36:47 +0000191del _names
192
Fred Drake02379091999-01-19 16:05:13 +0000193sys.modules['os.path'] = path
194
Skip Montanaro269b83b2001-02-06 01:07:02 +0000195#'
196
Guido van Rossum4def7de1998-07-24 20:48:03 +0000197# Super directory utilities.
198# (Inspired by Eric Raymond; the doc strings are mostly his)
199
200def makedirs(name, mode=0777):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000201 """makedirs(path [, mode=0777])
Guido van Rossum4def7de1998-07-24 20:48:03 +0000202
203 Super-mkdir; create a leaf directory and all intermediate ones.
204 Works like mkdir, except that any intermediate path segment (not
205 just the rightmost) will be created if it does not exist. This is
206 recursive.
207
208 """
209 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000210 if not tail:
211 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000212 if head and tail and not path.exists(head):
213 makedirs(head, mode)
214 mkdir(name, mode)
215
216def removedirs(name):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000217 """removedirs(path)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000218
219 Super-rmdir; remove a leaf directory and empty all intermediate
220 ones. Works like rmdir except that, if the leaf directory is
221 successfully removed, directories corresponding to rightmost path
222 segments will be pruned way until either the whole path is
223 consumed or an error occurs. Errors during this latter phase are
224 ignored -- they generally mean that a directory was not empty.
225
226 """
227 rmdir(name)
228 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000229 if not tail:
230 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000231 while head and tail:
232 try:
233 rmdir(head)
234 except error:
235 break
236 head, tail = path.split(head)
237
238def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000239 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000240
241 Super-rename; create directories as necessary and delete any left
242 empty. Works like rename, except creation of any intermediate
243 directories needed to make the new pathname good is attempted
244 first. After the rename, directories corresponding to rightmost
245 path segments of the old name will be pruned way until either the
246 whole path is consumed or a nonempty directory is found.
247
248 Note: this function can fail with the new directory structure made
249 if you lack permissions needed to unlink the leaf directory or
250 file.
251
252 """
253 head, tail = path.split(new)
254 if head and tail and not path.exists(head):
255 makedirs(head)
256 rename(old, new)
257 head, tail = path.split(old)
258 if head and tail:
259 try:
260 removedirs(head)
261 except error:
262 pass
263
Skip Montanaro269b83b2001-02-06 01:07:02 +0000264__all__.extend(["makedirs", "removedirs", "renames"])
265
Guido van Rossuma28dab51997-08-29 22:36:47 +0000266# Make sure os.environ exists, at least
267try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000268 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000269except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000270 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000271
Guido van Rossume65cce51993-11-08 15:05:21 +0000272def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000273 """execl(file, *args)
274
275 Execute the executable file with argument list args, replacing the
276 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000277 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000278
279def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000280 """execle(file, *args, env)
281
282 Execute the executable file with argument list args and
283 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000284 env = args[-1]
285 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000286
287def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000288 """execlp(file, *args)
289
290 Execute the executable file (which is searched for along $PATH)
291 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000292 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000293
Guido van Rossum030afb11995-03-14 17:27:18 +0000294def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000295 """execlpe(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 current
Tim Peters2344fae2001-01-15 00:50:52 +0000299 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000300 env = args[-1]
301 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000302
Guido van Rossume65cce51993-11-08 15:05:21 +0000303def execvp(file, args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000304 """execp(file, args)
305
306 Execute the executable file (which is searched for along $PATH)
307 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000308 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000309 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000310
311def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000312 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000313
314 Execute the executable file (which is searched for along $PATH)
315 with argument list args and environment env , replacing the
316 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000317 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000318 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000319
Skip Montanaro269b83b2001-02-06 01:07:02 +0000320__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
321
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000322def _execvpe(file, args, env=None):
Guido van Rossumaed51d82002-08-05 16:13:24 +0000323 from errno import ENOENT, ENOTDIR
324
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000325 if env is not None:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000326 func = execve
327 argrest = (args, env)
328 else:
329 func = execv
330 argrest = (args,)
331 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000332
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000333 head, tail = path.split(file)
334 if head:
335 apply(func, (file,) + argrest)
336 return
Raymond Hettinger54f02222002-06-01 14:18:47 +0000337 if 'PATH' in env:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000338 envpath = env['PATH']
339 else:
340 envpath = defpath
Guido van Rossum965fdae2000-04-04 19:50:04 +0000341 PATH = envpath.split(pathsep)
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000342 saved_exc = None
343 saved_tb = None
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000344 for dir in PATH:
345 fullname = path.join(dir, file)
346 try:
347 apply(func, (fullname,) + argrest)
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000348 except error, e:
349 tb = sys.exc_info()[2]
350 if (e.errno != ENOENT and e.errno != ENOTDIR
351 and saved_exc is None):
352 saved_exc = e
353 saved_tb = tb
354 if saved_exc:
355 raise error, saved_exc, saved_tb
356 raise error, e, tb
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000357
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000358# Change environ to automatically call putenv() if it exists
359try:
360 # This will fail if there's no putenv
361 putenv
362except NameError:
363 pass
364else:
365 import UserDict
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000366
Guido van Rossumc524d952001-10-19 01:31:59 +0000367 # Fake unsetenv() for Windows
Tim Peters1633a2e2001-10-30 05:56:40 +0000368 # not sure about os2 and dos here but
Guido van Rossumc524d952001-10-19 01:31:59 +0000369 # I'm guessing they are the same.
370
371 if name in ('os2', 'nt', 'dos'):
372 def unsetenv(key):
373 putenv(key, "")
374
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000375 if name == "riscos":
376 # On RISC OS, all env access goes through getenv and putenv
377 from riscosenviron import _Environ
378 elif name in ('os2', 'nt', 'dos'): # Where Env Var Names Must Be UPPERCASE
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000379 # But we store them as upper case
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000380 class _Environ(UserDict.UserDict):
381 def __init__(self, environ):
382 UserDict.UserDict.__init__(self)
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000383 data = self.data
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000384 for k, v in environ.items():
Guido van Rossum965fdae2000-04-04 19:50:04 +0000385 data[k.upper()] = v
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000386 def __setitem__(self, key, item):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000387 putenv(key, item)
Guido van Rossum965fdae2000-04-04 19:50:04 +0000388 self.data[key.upper()] = item
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000389 def __getitem__(self, key):
Guido van Rossum965fdae2000-04-04 19:50:04 +0000390 return self.data[key.upper()]
Guido van Rossumc524d952001-10-19 01:31:59 +0000391 try:
392 unsetenv
393 except NameError:
394 def __delitem__(self, key):
395 del self.data[key.upper()]
396 else:
397 def __delitem__(self, key):
398 unsetenv(key)
399 del self.data[key.upper()]
Guido van Rossumb46413f1999-05-03 15:23:24 +0000400 def has_key(self, key):
Raymond Hettinger54f02222002-06-01 14:18:47 +0000401 return key.upper() in self.data
402 def __contains__(self, key):
403 return key.upper() in self.data
Guido van Rossum965fdae2000-04-04 19:50:04 +0000404 def get(self, key, failobj=None):
405 return self.data.get(key.upper(), failobj)
406 def update(self, dict):
407 for k, v in dict.items():
408 self[k] = v
Martin v. Löwisa066f462002-05-02 17:39:19 +0000409 def copy(self):
410 return dict(self)
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000411
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000412 else: # Where Env Var Names Can Be Mixed Case
413 class _Environ(UserDict.UserDict):
414 def __init__(self, environ):
415 UserDict.UserDict.__init__(self)
416 self.data = environ
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000417 def __setitem__(self, key, item):
418 putenv(key, item)
419 self.data[key] = item
Guido van Rossum965fdae2000-04-04 19:50:04 +0000420 def update(self, dict):
421 for k, v in dict.items():
422 self[k] = v
Guido van Rossumc524d952001-10-19 01:31:59 +0000423 try:
424 unsetenv
425 except NameError:
426 pass
427 else:
428 def __delitem__(self, key):
429 unsetenv(key)
430 del self.data[key]
Martin v. Löwisa066f462002-05-02 17:39:19 +0000431 def copy(self):
432 return dict(self)
Tim Peters1633a2e2001-10-30 05:56:40 +0000433
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000434
435 environ = _Environ(environ)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000436
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000437 def getenv(key, default=None):
438 """Get an environment variable, return None if it doesn't exist.
439 The optional second argument can specify an alternate default."""
440 return environ.get(key, default)
441 __all__.append("getenv")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000442
443def _exists(name):
444 try:
445 eval(name)
Tim Petersbc0e9102002-04-04 22:55:58 +0000446 return True
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000447 except NameError:
Tim Petersbc0e9102002-04-04 22:55:58 +0000448 return False
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000449
450# Supply spawn*() (probably only for Unix)
451if _exists("fork") and not _exists("spawnv") and _exists("execv"):
452
453 P_WAIT = 0
454 P_NOWAIT = P_NOWAITO = 1
455
456 # XXX Should we support P_DETACH? I suppose it could fork()**2
457 # and close the std I/O streams. Also, P_OVERLAY is the same
458 # as execv*()?
459
460 def _spawnvef(mode, file, args, env, func):
461 # Internal helper; func is the exec*() function to use
462 pid = fork()
463 if not pid:
464 # Child
465 try:
466 if env is None:
467 func(file, args)
468 else:
469 func(file, args, env)
470 except:
471 _exit(127)
472 else:
473 # Parent
474 if mode == P_NOWAIT:
475 return pid # Caller is responsible for waiting!
476 while 1:
477 wpid, sts = waitpid(pid, 0)
478 if WIFSTOPPED(sts):
479 continue
480 elif WIFSIGNALED(sts):
481 return -WTERMSIG(sts)
482 elif WIFEXITED(sts):
483 return WEXITSTATUS(sts)
484 else:
485 raise error, "Not stopped, signaled or exited???"
486
487 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000488 """spawnv(mode, file, args) -> integer
489
490Execute file with arguments from args in a subprocess.
491If mode == P_NOWAIT return the pid of the process.
492If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000493otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000494 return _spawnvef(mode, file, args, None, execv)
495
496 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000497 """spawnve(mode, file, args, env) -> integer
498
499Execute file with arguments from args in a subprocess with the
500specified environment.
501If mode == P_NOWAIT return the pid of the process.
502If mode == P_WAIT return the process's exit code if it exits normally;
503otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000504 return _spawnvef(mode, file, args, env, execve)
505
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000506 # Note: spawnvp[e] is't currently supported on Windows
507
508 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000509 """spawnvp(mode, file, args) -> integer
510
511Execute file (which is looked for along $PATH) with arguments from
512args in a subprocess.
513If mode == P_NOWAIT return the pid of the process.
514If mode == P_WAIT return the process's exit code if it exits normally;
515otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000516 return _spawnvef(mode, file, args, None, execvp)
517
518 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000519 """spawnvpe(mode, file, args, env) -> integer
520
521Execute file (which is looked for along $PATH) with arguments from
522args in a subprocess with the supplied environment.
523If mode == P_NOWAIT return the pid of the process.
524If mode == P_WAIT return the process's exit code if it exits normally;
525otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000526 return _spawnvef(mode, file, args, env, execvpe)
527
528if _exists("spawnv"):
529 # These aren't supplied by the basic Windows code
530 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000531
532 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000533 """spawnl(mode, file, *args) -> integer
534
535Execute file with arguments from args in a subprocess.
536If mode == P_NOWAIT return the pid of the process.
537If mode == P_WAIT return the process's exit code if it exits normally;
538otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000539 return spawnv(mode, file, args)
540
541 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000542 """spawnle(mode, file, *args, env) -> integer
543
544Execute file with arguments from args in a subprocess with the
545supplied environment.
546If mode == P_NOWAIT return the pid of the process.
547If mode == P_WAIT return the process's exit code if it exits normally;
548otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000549 env = args[-1]
550 return spawnve(mode, file, args[:-1], env)
551
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000552if _exists("spawnvp"):
553 # At the moment, Windows doesn't implement spawnvp[e],
554 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000555 def spawnlp(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000556 """spawnlp(mode, file, *args, env) -> integer
557
558Execute file (which is looked for along $PATH) with arguments from
559args in a subprocess with the supplied environment.
560If mode == P_NOWAIT return the pid of the process.
561If mode == P_WAIT return the process's exit code if it exits normally;
562otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000563 return spawnvp(mode, file, args)
564
565 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000566 """spawnlpe(mode, file, *args, env) -> integer
567
568Execute file (which is looked for along $PATH) with arguments from
569args in a subprocess with the supplied environment.
570If mode == P_NOWAIT return the pid of the process.
571If mode == P_WAIT return the process's exit code if it exits normally;
572otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000573 env = args[-1]
574 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000575
576
Skip Montanaro269b83b2001-02-06 01:07:02 +0000577 __all__.extend(["spawnlp","spawnlpe","spawnv", "spawnve","spawnvp",
578 "spawnvpe","spawnl","spawnle",])
579
580
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000581# Supply popen2 etc. (for Unix)
582if _exists("fork"):
583 if not _exists("popen2"):
584 def popen2(cmd, mode="t", bufsize=-1):
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000585 import popen2
586 stdout, stdin = popen2.popen2(cmd, bufsize)
587 return stdin, stdout
Skip Montanaro269b83b2001-02-06 01:07:02 +0000588 __all__.append("popen2")
Fred Drake31f182e2000-08-28 17:20:05 +0000589
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000590 if not _exists("popen3"):
591 def popen3(cmd, mode="t", bufsize=-1):
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000592 import popen2
593 stdout, stdin, stderr = popen2.popen3(cmd, bufsize)
594 return stdin, stdout, stderr
Skip Montanaro269b83b2001-02-06 01:07:02 +0000595 __all__.append("popen3")
Fred Drake20af3172000-09-28 19:10:56 +0000596
597 if not _exists("popen4"):
598 def popen4(cmd, mode="t", bufsize=-1):
599 import popen2
600 stdout, stdin = popen2.popen4(cmd, bufsize)
601 return stdin, stdout
Skip Montanaro269b83b2001-02-06 01:07:02 +0000602 __all__.append("popen4")
Michael W. Hudson0e025302002-03-06 17:11:18 +0000603
604import copy_reg as _copy_reg
605
606def _make_stat_result(tup, dict):
607 return stat_result(tup, dict)
608
609def _pickle_stat_result(sr):
610 (type, args) = sr.__reduce__()
611 return (_make_stat_result, args)
612
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000613try:
614 _copy_reg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
615except NameError: # stat_result may not exist
616 pass
Michael W. Hudson0e025302002-03-06 17:11:18 +0000617
618def _make_statvfs_result(tup, dict):
619 return statvfs_result(tup, dict)
620
621def _pickle_statvfs_result(sr):
622 (type, args) = sr.__reduce__()
623 return (_make_statvfs_result, args)
624
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000625try:
626 _copy_reg.pickle(statvfs_result, _pickle_statvfs_result,
627 _make_statvfs_result)
Michael W. Hudsone5363b72002-03-15 10:21:59 +0000628except NameError: # statvfs_result may not exist
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000629 pass