blob: 128351e290e3752b7643acb5fcdaf243ad5a04c9 [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
Tim Petersc4e09402003-04-25 07:11:48 +000029# Note: more names are added to __all__ later.
Skip Montanaro6c0a0e12001-02-28 01:00:58 +000030__all__ = ["altsep", "curdir", "pardir", "sep", "pathsep", "linesep",
Skip Montanaro117910d2003-02-14 19:35:31 +000031 "defpath", "name", "path"]
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 from posix import *
43 try:
44 from posix import _exit
45 except ImportError:
46 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000047 import posixpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000048
Skip Montanaro269b83b2001-02-06 01:07:02 +000049 import posix
50 __all__.extend(_get_exports_list(posix))
51 del posix
52
Guido van Rossuma28dab51997-08-29 22:36:47 +000053elif 'nt' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000054 name = 'nt'
Guido van Rossume9387ea1998-05-22 15:26:04 +000055 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000056 from nt import *
Tim Peters6757c1e2003-01-08 21:20:57 +000057 try:
58 from nt import _exit
59 except ImportError:
60 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000061 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000062
Skip Montanaro269b83b2001-02-06 01:07:02 +000063 import nt
64 __all__.extend(_get_exports_list(nt))
65 del nt
66
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000067elif 'os2' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000068 name = 'os2'
Guido van Rossume9387ea1998-05-22 15:26:04 +000069 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000070 from os2 import *
71 try:
72 from os2 import _exit
73 except ImportError:
74 pass
Andrew MacIntyre5cef5712002-02-24 05:32:32 +000075 if sys.version.find('EMX GCC') == -1:
Skip Montanaro117910d2003-02-14 19:35:31 +000076 import ntpath as path
Andrew MacIntyre5cef5712002-02-24 05:32:32 +000077 else:
Skip Montanaro117910d2003-02-14 19:35:31 +000078 import os2emxpath as path
Andrew MacIntyre89f98652003-12-02 12:33:01 +000079 from _emx_link import link
Tim Petersf2715e02003-02-19 02:35:07 +000080
Skip Montanaro269b83b2001-02-06 01:07:02 +000081 import os2
82 __all__.extend(_get_exports_list(os2))
83 del os2
84
Guido van Rossuma28dab51997-08-29 22:36:47 +000085elif 'mac' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000086 name = 'mac'
Guido van Rossume9387ea1998-05-22 15:26:04 +000087 linesep = '\r'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000088 from mac import *
89 try:
90 from mac import _exit
91 except ImportError:
92 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000093 import macpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000094
Skip Montanaro269b83b2001-02-06 01:07:02 +000095 import mac
96 __all__.extend(_get_exports_list(mac))
97 del mac
98
Guido van Rossum18df5d41999-06-11 01:37:27 +000099elif 'ce' in _names:
100 name = 'ce'
101 linesep = '\r\n'
Guido van Rossum18df5d41999-06-11 01:37:27 +0000102 from ce import *
Tim Peters6757c1e2003-01-08 21:20:57 +0000103 try:
104 from ce import _exit
105 except ImportError:
106 pass
Guido van Rossum18df5d41999-06-11 01:37:27 +0000107 # We can use the standard Windows path.
Skip Montanaro117910d2003-02-14 19:35:31 +0000108 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +0000109
Skip Montanaro269b83b2001-02-06 01:07:02 +0000110 import ce
111 __all__.extend(_get_exports_list(ce))
112 del ce
113
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000114elif 'riscos' in _names:
115 name = 'riscos'
116 linesep = '\n'
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000117 from riscos import *
118 try:
119 from riscos import _exit
120 except ImportError:
121 pass
Skip Montanaro117910d2003-02-14 19:35:31 +0000122 import riscospath as path
Tim Petersf2715e02003-02-19 02:35:07 +0000123
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000124 import riscos
125 __all__.extend(_get_exports_list(riscos))
Skip Montanaro81e4b1c2001-03-06 15:26:07 +0000126 del riscos
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000127
Guido van Rossum2979b011994-08-01 11:18:30 +0000128else:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000129 raise ImportError, 'no os specific module found'
Guido van Rossume65cce51993-11-08 15:05:21 +0000130
Skip Montanaro117910d2003-02-14 19:35:31 +0000131sys.modules['os.path'] = path
132from os.path import curdir, pardir, sep, pathsep, defpath, extsep, altsep
Skip Montanaro269b83b2001-02-06 01:07:02 +0000133
Guido van Rossuma28dab51997-08-29 22:36:47 +0000134del _names
135
Skip Montanaro269b83b2001-02-06 01:07:02 +0000136#'
137
Guido van Rossum4def7de1998-07-24 20:48:03 +0000138# Super directory utilities.
139# (Inspired by Eric Raymond; the doc strings are mostly his)
140
141def makedirs(name, mode=0777):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000142 """makedirs(path [, mode=0777])
Guido van Rossum4def7de1998-07-24 20:48:03 +0000143
144 Super-mkdir; create a leaf directory and all intermediate ones.
145 Works like mkdir, except that any intermediate path segment (not
146 just the rightmost) will be created if it does not exist. This is
147 recursive.
148
149 """
150 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000151 if not tail:
152 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000153 if head and tail and not path.exists(head):
154 makedirs(head, mode)
155 mkdir(name, mode)
156
157def removedirs(name):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000158 """removedirs(path)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000159
160 Super-rmdir; remove a leaf directory and empty all intermediate
161 ones. Works like rmdir except that, if the leaf directory is
162 successfully removed, directories corresponding to rightmost path
Tim Petersc4e09402003-04-25 07:11:48 +0000163 segments will be pruned away until either the whole path is
Guido van Rossum4def7de1998-07-24 20:48:03 +0000164 consumed or an error occurs. Errors during this latter phase are
165 ignored -- they generally mean that a directory was not empty.
166
167 """
168 rmdir(name)
169 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000170 if not tail:
171 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000172 while head and tail:
173 try:
174 rmdir(head)
175 except error:
176 break
177 head, tail = path.split(head)
178
179def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000180 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000181
182 Super-rename; create directories as necessary and delete any left
183 empty. Works like rename, except creation of any intermediate
184 directories needed to make the new pathname good is attempted
185 first. After the rename, directories corresponding to rightmost
186 path segments of the old name will be pruned way until either the
187 whole path is consumed or a nonempty directory is found.
188
189 Note: this function can fail with the new directory structure made
190 if you lack permissions needed to unlink the leaf directory or
191 file.
192
193 """
194 head, tail = path.split(new)
195 if head and tail and not path.exists(head):
196 makedirs(head)
197 rename(old, new)
198 head, tail = path.split(old)
199 if head and tail:
200 try:
201 removedirs(head)
202 except error:
203 pass
204
Skip Montanaro269b83b2001-02-06 01:07:02 +0000205__all__.extend(["makedirs", "removedirs", "renames"])
206
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000207def walk(top, topdown=True, onerror=None):
Tim Petersc4e09402003-04-25 07:11:48 +0000208 """Directory tree generator.
209
210 For each directory in the directory tree rooted at top (including top
211 itself, but excluding '.' and '..'), yields a 3-tuple
212
213 dirpath, dirnames, filenames
214
215 dirpath is a string, the path to the directory. dirnames is a list of
216 the names of the subdirectories in dirpath (excluding '.' and '..').
217 filenames is a list of the names of the non-directory files in dirpath.
218 Note that the names in the lists are just names, with no path components.
219 To get a full path (which begins with top) to a file or directory in
220 dirpath, do os.path.join(dirpath, name).
221
222 If optional arg 'topdown' is true or not specified, the triple for a
223 directory is generated before the triples for any of its subdirectories
224 (directories are generated top down). If topdown is false, the triple
225 for a directory is generated after the triples for all of its
226 subdirectories (directories are generated bottom up).
227
228 When topdown is true, the caller can modify the dirnames list in-place
229 (e.g., via del or slice assignment), and walk will only recurse into the
230 subdirectories whose names remain in dirnames; this can be used to prune
231 the search, or to impose a specific order of visiting. Modifying
232 dirnames when topdown is false is ineffective, since the directories in
233 dirnames have already been generated by the time dirnames itself is
234 generated.
235
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000236 By default errors from the os.listdir() call are ignored. If
237 optional arg 'onerror' is specified, it should be a function; it
238 will be called with one argument, an os.error instance. It can
239 report the error to continue with the walk, or raise the exception
240 to abort the walk. Note that the filename is available as the
241 filename attribute of the exception object.
242
Tim Petersc4e09402003-04-25 07:11:48 +0000243 Caution: if you pass a relative pathname for top, don't change the
244 current working directory between resumptions of walk. walk never
245 changes the current directory, and assumes that the client doesn't
246 either.
247
248 Example:
249
250 from os.path import join, getsize
251 for root, dirs, files in walk('python/Lib/email'):
252 print root, "consumes",
253 print sum([getsize(join(root, name)) for name in files]),
254 print "bytes in", len(files), "non-directory files"
255 if 'CVS' in dirs:
256 dirs.remove('CVS') # don't visit CVS directories
257 """
258
259 from os.path import join, isdir, islink
260
261 # We may not have read permission for top, in which case we can't
262 # get a list of the files the directory contains. os.path.walk
263 # always suppressed the exception then, rather than blow up for a
264 # minor reason when (say) a thousand readable directories are still
265 # left to visit. That logic is copied here.
266 try:
267 # Note that listdir and error are globals in this module due
268 # to earlier import-*.
269 names = listdir(top)
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000270 except error, err:
271 if onerror is not None:
272 onerror(err)
Tim Petersc4e09402003-04-25 07:11:48 +0000273 return
274
275 dirs, nondirs = [], []
276 for name in names:
277 if isdir(join(top, name)):
278 dirs.append(name)
279 else:
280 nondirs.append(name)
281
282 if topdown:
283 yield top, dirs, nondirs
284 for name in dirs:
285 path = join(top, name)
286 if not islink(path):
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000287 for x in walk(path, topdown, onerror):
Tim Petersc4e09402003-04-25 07:11:48 +0000288 yield x
289 if not topdown:
290 yield top, dirs, nondirs
291
292__all__.append("walk")
293
Guido van Rossuma28dab51997-08-29 22:36:47 +0000294# Make sure os.environ exists, at least
295try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000296 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000297except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000298 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000299
Guido van Rossume65cce51993-11-08 15:05:21 +0000300def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000301 """execl(file, *args)
302
303 Execute the executable file with argument list args, replacing the
304 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000305 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000306
307def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000308 """execle(file, *args, env)
309
310 Execute the executable file with argument list args and
311 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000312 env = args[-1]
313 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000314
315def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000316 """execlp(file, *args)
317
318 Execute the executable file (which is searched for along $PATH)
319 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000320 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000321
Guido van Rossum030afb11995-03-14 17:27:18 +0000322def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000323 """execlpe(file, *args, env)
324
325 Execute the executable file (which is searched for along $PATH)
326 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000327 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000328 env = args[-1]
329 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000330
Guido van Rossume65cce51993-11-08 15:05:21 +0000331def execvp(file, args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000332 """execp(file, args)
333
334 Execute the executable file (which is searched for along $PATH)
335 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000336 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000337 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000338
339def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000340 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000341
342 Execute the executable file (which is searched for along $PATH)
343 with argument list args and environment env , replacing the
344 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000345 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000346 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000347
Skip Montanaro269b83b2001-02-06 01:07:02 +0000348__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
349
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000350def _execvpe(file, args, env=None):
Guido van Rossumaed51d82002-08-05 16:13:24 +0000351 from errno import ENOENT, ENOTDIR
352
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000353 if env is not None:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000354 func = execve
355 argrest = (args, env)
356 else:
357 func = execv
358 argrest = (args,)
359 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000360
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000361 head, tail = path.split(file)
362 if head:
Guido van Rossum68468eb2003-02-27 20:14:51 +0000363 func(file, *argrest)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000364 return
Raymond Hettinger54f02222002-06-01 14:18:47 +0000365 if 'PATH' in env:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000366 envpath = env['PATH']
367 else:
368 envpath = defpath
Guido van Rossum965fdae2000-04-04 19:50:04 +0000369 PATH = envpath.split(pathsep)
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000370 saved_exc = None
371 saved_tb = None
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000372 for dir in PATH:
373 fullname = path.join(dir, file)
374 try:
Guido van Rossum68468eb2003-02-27 20:14:51 +0000375 func(fullname, *argrest)
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000376 except error, e:
377 tb = sys.exc_info()[2]
378 if (e.errno != ENOENT and e.errno != ENOTDIR
379 and saved_exc is None):
380 saved_exc = e
381 saved_tb = tb
382 if saved_exc:
383 raise error, saved_exc, saved_tb
384 raise error, e, tb
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000385
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000386# Change environ to automatically call putenv() if it exists
387try:
388 # This will fail if there's no putenv
389 putenv
390except NameError:
391 pass
392else:
393 import UserDict
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000394
Guido van Rossumc524d952001-10-19 01:31:59 +0000395 # Fake unsetenv() for Windows
Martin v. Löwis8b10f892002-10-09 17:23:29 +0000396 # not sure about os2 here but
Guido van Rossumc524d952001-10-19 01:31:59 +0000397 # I'm guessing they are the same.
398
Martin v. Löwis8b10f892002-10-09 17:23:29 +0000399 if name in ('os2', 'nt'):
Guido van Rossumc524d952001-10-19 01:31:59 +0000400 def unsetenv(key):
401 putenv(key, "")
402
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000403 if name == "riscos":
404 # On RISC OS, all env access goes through getenv and putenv
405 from riscosenviron import _Environ
Martin v. Löwis8b10f892002-10-09 17:23:29 +0000406 elif name in ('os2', 'nt'): # Where Env Var Names Must Be UPPERCASE
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000407 # But we store them as upper case
Raymond Hettingerca2f5372002-09-06 19:36:31 +0000408 class _Environ(UserDict.IterableUserDict):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000409 def __init__(self, environ):
410 UserDict.UserDict.__init__(self)
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000411 data = self.data
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000412 for k, v in environ.items():
Guido van Rossum965fdae2000-04-04 19:50:04 +0000413 data[k.upper()] = v
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000414 def __setitem__(self, key, item):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000415 putenv(key, item)
Guido van Rossum965fdae2000-04-04 19:50:04 +0000416 self.data[key.upper()] = item
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000417 def __getitem__(self, key):
Guido van Rossum965fdae2000-04-04 19:50:04 +0000418 return self.data[key.upper()]
Guido van Rossumc524d952001-10-19 01:31:59 +0000419 try:
420 unsetenv
421 except NameError:
422 def __delitem__(self, key):
423 del self.data[key.upper()]
424 else:
425 def __delitem__(self, key):
426 unsetenv(key)
427 del self.data[key.upper()]
Guido van Rossumb46413f1999-05-03 15:23:24 +0000428 def has_key(self, key):
Raymond Hettinger54f02222002-06-01 14:18:47 +0000429 return key.upper() in self.data
430 def __contains__(self, key):
431 return key.upper() in self.data
Guido van Rossum965fdae2000-04-04 19:50:04 +0000432 def get(self, key, failobj=None):
433 return self.data.get(key.upper(), failobj)
434 def update(self, dict):
435 for k, v in dict.items():
436 self[k] = v
Martin v. Löwisa066f462002-05-02 17:39:19 +0000437 def copy(self):
438 return dict(self)
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000439
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000440 else: # Where Env Var Names Can Be Mixed Case
Raymond Hettinger05212fc2002-09-07 04:48:03 +0000441 class _Environ(UserDict.IterableUserDict):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000442 def __init__(self, environ):
443 UserDict.UserDict.__init__(self)
444 self.data = environ
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000445 def __setitem__(self, key, item):
446 putenv(key, item)
447 self.data[key] = item
Guido van Rossum965fdae2000-04-04 19:50:04 +0000448 def update(self, dict):
449 for k, v in dict.items():
450 self[k] = v
Guido van Rossumc524d952001-10-19 01:31:59 +0000451 try:
452 unsetenv
453 except NameError:
454 pass
455 else:
456 def __delitem__(self, key):
457 unsetenv(key)
458 del self.data[key]
Martin v. Löwisa066f462002-05-02 17:39:19 +0000459 def copy(self):
460 return dict(self)
Tim Peters1633a2e2001-10-30 05:56:40 +0000461
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000462
463 environ = _Environ(environ)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000464
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000465def getenv(key, default=None):
Tim Peters2c60f7a2003-01-29 03:49:43 +0000466 """Get an environment variable, return None if it doesn't exist.
467 The optional second argument can specify an alternate default."""
468 return environ.get(key, default)
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000469__all__.append("getenv")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000470
471def _exists(name):
472 try:
473 eval(name)
Tim Petersbc0e9102002-04-04 22:55:58 +0000474 return True
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000475 except NameError:
Tim Petersbc0e9102002-04-04 22:55:58 +0000476 return False
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000477
478# Supply spawn*() (probably only for Unix)
479if _exists("fork") and not _exists("spawnv") and _exists("execv"):
480
481 P_WAIT = 0
482 P_NOWAIT = P_NOWAITO = 1
483
484 # XXX Should we support P_DETACH? I suppose it could fork()**2
485 # and close the std I/O streams. Also, P_OVERLAY is the same
486 # as execv*()?
487
488 def _spawnvef(mode, file, args, env, func):
489 # Internal helper; func is the exec*() function to use
490 pid = fork()
491 if not pid:
492 # Child
493 try:
494 if env is None:
495 func(file, args)
496 else:
497 func(file, args, env)
498 except:
499 _exit(127)
500 else:
501 # Parent
502 if mode == P_NOWAIT:
503 return pid # Caller is responsible for waiting!
504 while 1:
505 wpid, sts = waitpid(pid, 0)
506 if WIFSTOPPED(sts):
507 continue
508 elif WIFSIGNALED(sts):
509 return -WTERMSIG(sts)
510 elif WIFEXITED(sts):
511 return WEXITSTATUS(sts)
512 else:
513 raise error, "Not stopped, signaled or exited???"
514
515 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000516 """spawnv(mode, file, args) -> integer
517
518Execute file with arguments from args in a subprocess.
519If mode == P_NOWAIT return the pid of the process.
520If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000521otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000522 return _spawnvef(mode, file, args, None, execv)
523
524 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000525 """spawnve(mode, file, args, env) -> integer
526
527Execute file with arguments from args in a subprocess with the
528specified environment.
529If mode == P_NOWAIT return the pid of the process.
530If mode == P_WAIT return the process's exit code if it exits normally;
531otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000532 return _spawnvef(mode, file, args, env, execve)
533
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000534 # Note: spawnvp[e] is't currently supported on Windows
535
536 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000537 """spawnvp(mode, file, args) -> integer
538
539Execute file (which is looked for along $PATH) with arguments from
540args in a subprocess.
541If mode == P_NOWAIT return the pid of the process.
542If mode == P_WAIT return the process's exit code if it exits normally;
543otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000544 return _spawnvef(mode, file, args, None, execvp)
545
546 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000547 """spawnvpe(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 Rossumdd7cbbf1999-11-02 20:44:07 +0000554 return _spawnvef(mode, file, args, env, execvpe)
555
556if _exists("spawnv"):
557 # These aren't supplied by the basic Windows code
558 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000559
560 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000561 """spawnl(mode, file, *args) -> integer
562
563Execute file with arguments from args in a subprocess.
564If mode == P_NOWAIT return the pid of the process.
565If mode == P_WAIT return the process's exit code if it exits normally;
566otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000567 return spawnv(mode, file, args)
568
569 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000570 """spawnle(mode, file, *args, env) -> integer
571
572Execute file with arguments from args in a subprocess with the
573supplied environment.
574If mode == P_NOWAIT return the pid of the process.
575If mode == P_WAIT return the process's exit code if it exits normally;
576otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000577 env = args[-1]
578 return spawnve(mode, file, args[:-1], env)
579
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000580if _exists("spawnvp"):
581 # At the moment, Windows doesn't implement spawnvp[e],
582 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000583 def spawnlp(mode, file, *args):
Neal Norwitzb7f68102003-07-02 02:49:33 +0000584 """spawnlp(mode, file, *args) -> integer
Guido van Rossume0cd2912000-04-21 18:35:36 +0000585
586Execute file (which is looked for along $PATH) with arguments from
587args in a subprocess with the supplied environment.
588If mode == P_NOWAIT return the pid of the process.
589If mode == P_WAIT return the process's exit code if it exits normally;
590otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000591 return spawnvp(mode, file, args)
592
593 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000594 """spawnlpe(mode, file, *args, env) -> integer
595
596Execute file (which is looked for along $PATH) with arguments from
597args in a subprocess with the supplied environment.
598If mode == P_NOWAIT return the pid of the process.
599If mode == P_WAIT return the process's exit code if it exits normally;
600otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000601 env = args[-1]
602 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000603
604
Skip Montanaro269b83b2001-02-06 01:07:02 +0000605 __all__.extend(["spawnlp","spawnlpe","spawnv", "spawnve","spawnvp",
606 "spawnvpe","spawnl","spawnle",])
607
608
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000609# Supply popen2 etc. (for Unix)
610if _exists("fork"):
611 if not _exists("popen2"):
612 def popen2(cmd, mode="t", bufsize=-1):
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000613 import popen2
614 stdout, stdin = popen2.popen2(cmd, bufsize)
615 return stdin, stdout
Skip Montanaro269b83b2001-02-06 01:07:02 +0000616 __all__.append("popen2")
Fred Drake31f182e2000-08-28 17:20:05 +0000617
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000618 if not _exists("popen3"):
619 def popen3(cmd, mode="t", bufsize=-1):
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000620 import popen2
621 stdout, stdin, stderr = popen2.popen3(cmd, bufsize)
622 return stdin, stdout, stderr
Skip Montanaro269b83b2001-02-06 01:07:02 +0000623 __all__.append("popen3")
Fred Drake20af3172000-09-28 19:10:56 +0000624
625 if not _exists("popen4"):
626 def popen4(cmd, mode="t", bufsize=-1):
627 import popen2
628 stdout, stdin = popen2.popen4(cmd, bufsize)
629 return stdin, stdout
Skip Montanaro269b83b2001-02-06 01:07:02 +0000630 __all__.append("popen4")
Michael W. Hudson0e025302002-03-06 17:11:18 +0000631
632import copy_reg as _copy_reg
633
634def _make_stat_result(tup, dict):
635 return stat_result(tup, dict)
636
637def _pickle_stat_result(sr):
638 (type, args) = sr.__reduce__()
639 return (_make_stat_result, args)
640
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000641try:
642 _copy_reg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
643except NameError: # stat_result may not exist
644 pass
Michael W. Hudson0e025302002-03-06 17:11:18 +0000645
646def _make_statvfs_result(tup, dict):
647 return statvfs_result(tup, dict)
648
649def _pickle_statvfs_result(sr):
650 (type, args) = sr.__reduce__()
651 return (_make_statvfs_result, args)
652
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000653try:
654 _copy_reg.pickle(statvfs_result, _pickle_statvfs_result,
655 _make_statvfs_result)
Michael W. Hudsone5363b72002-03-15 10:21:59 +0000656except NameError: # statvfs_result may not exist
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000657 pass