blob: abbadc41e44b0a44d09f04504f8554655fe3f36b [file] [log] [blame]
Georg Brandlbde4ad42006-01-20 21:36:02 +00001r"""OS routines for Mac, 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:
Ronald Oussoren81af68e2008-05-12 11:24:33 +00004 - all functions from posix, nt, os2, or ce, e.g. unlink, stat, etc.
5 - os.path is one of the modules posixpath, or ntpath
6 - os.name is 'posix', 'nt', 'os2', '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
Martin v. Löwisbdec50f2004-06-08 08:29:33 +000015 - os.devnull is the file path of the null device ('/dev/null', etc.)
Guido van Rossum31104f41992-01-14 18:28:36 +000016
Guido van Rossum54f22ed2000-02-04 15:10:34 +000017Programs that import and use 'os' stand a better chance of being
18portable between different platforms. Of course, they must then
19only use functions that are defined by all platforms (e.g., unlink
20and opendir), and leave all pathname manipulation to os.path
21(e.g., split and join).
22"""
Guido van Rossum31104f41992-01-14 18:28:36 +000023
Skip Montanaro269b83b2001-02-06 01:07:02 +000024#'
25
Facundo Batista2ffd7802007-11-27 18:50:12 +000026import sys, errno
Guido van Rossuma28dab51997-08-29 22:36:47 +000027
28_names = sys.builtin_module_names
29
Tim Petersc4e09402003-04-25 07:11:48 +000030# Note: more names are added to __all__ later.
Brett Cannon88f801d2008-08-18 00:46:22 +000031__all__ = ["altsep", "curdir", "pardir", "sep", "extsep", "pathsep", "linesep",
Martin v. Löwis22b457e2005-01-16 08:40:58 +000032 "defpath", "name", "path", "devnull",
33 "SEEK_SET", "SEEK_CUR", "SEEK_END"]
Skip Montanaro269b83b2001-02-06 01:07:02 +000034
35def _get_exports_list(module):
36 try:
37 return list(module.__all__)
38 except AttributeError:
39 return [n for n in dir(module) if n[0] != '_']
40
Guido van Rossuma28dab51997-08-29 22:36:47 +000041if 'posix' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000042 name = 'posix'
Guido van Rossume9387ea1998-05-22 15:26:04 +000043 linesep = '\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000044 from posix import *
45 try:
46 from posix import _exit
47 except ImportError:
48 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000049 import posixpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000050
Skip Montanaro269b83b2001-02-06 01:07:02 +000051 import posix
52 __all__.extend(_get_exports_list(posix))
53 del posix
54
Guido van Rossuma28dab51997-08-29 22:36:47 +000055elif 'nt' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000056 name = 'nt'
Guido van Rossume9387ea1998-05-22 15:26:04 +000057 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000058 from nt import *
Tim Peters6757c1e2003-01-08 21:20:57 +000059 try:
60 from nt import _exit
61 except ImportError:
62 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000063 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000064
Skip Montanaro269b83b2001-02-06 01:07:02 +000065 import nt
66 __all__.extend(_get_exports_list(nt))
67 del nt
68
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000069elif 'os2' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000070 name = 'os2'
Guido van Rossume9387ea1998-05-22 15:26:04 +000071 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000072 from os2 import *
73 try:
74 from os2 import _exit
75 except ImportError:
76 pass
Andrew MacIntyre5cef5712002-02-24 05:32:32 +000077 if sys.version.find('EMX GCC') == -1:
Skip Montanaro117910d2003-02-14 19:35:31 +000078 import ntpath as path
Andrew MacIntyre5cef5712002-02-24 05:32:32 +000079 else:
Skip Montanaro117910d2003-02-14 19:35:31 +000080 import os2emxpath as path
Andrew MacIntyre89f98652003-12-02 12:33:01 +000081 from _emx_link import link
Tim Petersf2715e02003-02-19 02:35:07 +000082
Skip Montanaro269b83b2001-02-06 01:07:02 +000083 import os2
84 __all__.extend(_get_exports_list(os2))
85 del os2
86
Guido van Rossum18df5d41999-06-11 01:37:27 +000087elif 'ce' in _names:
88 name = 'ce'
89 linesep = '\r\n'
Guido van Rossum18df5d41999-06-11 01:37:27 +000090 from ce import *
Tim Peters6757c1e2003-01-08 21:20:57 +000091 try:
92 from ce import _exit
93 except ImportError:
94 pass
Guido van Rossum18df5d41999-06-11 01:37:27 +000095 # We can use the standard Windows path.
Skip Montanaro117910d2003-02-14 19:35:31 +000096 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000097
Skip Montanaro269b83b2001-02-06 01:07:02 +000098 import ce
99 __all__.extend(_get_exports_list(ce))
100 del ce
101
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000102elif 'riscos' in _names:
103 name = 'riscos'
104 linesep = '\n'
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000105 from riscos import *
106 try:
107 from riscos import _exit
108 except ImportError:
109 pass
Skip Montanaro117910d2003-02-14 19:35:31 +0000110 import riscospath as path
Tim Petersf2715e02003-02-19 02:35:07 +0000111
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000112 import riscos
113 __all__.extend(_get_exports_list(riscos))
Skip Montanaro81e4b1c2001-03-06 15:26:07 +0000114 del riscos
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000115
Guido van Rossum2979b011994-08-01 11:18:30 +0000116else:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000117 raise ImportError, 'no os specific module found'
Guido van Rossume65cce51993-11-08 15:05:21 +0000118
Skip Montanaro117910d2003-02-14 19:35:31 +0000119sys.modules['os.path'] = path
Tim Peters3b2cdad2004-09-01 13:10:32 +0000120from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep,
Andrew M. Kuchling33ad28b2004-08-31 11:38:12 +0000121 devnull)
Skip Montanaro269b83b2001-02-06 01:07:02 +0000122
Guido van Rossuma28dab51997-08-29 22:36:47 +0000123del _names
124
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000125# Python uses fixed values for the SEEK_ constants; they are mapped
126# to native constants if necessary in posixmodule.c
127SEEK_SET = 0
128SEEK_CUR = 1
129SEEK_END = 2
130
Skip Montanaro269b83b2001-02-06 01:07:02 +0000131#'
132
Guido van Rossum4def7de1998-07-24 20:48:03 +0000133# Super directory utilities.
134# (Inspired by Eric Raymond; the doc strings are mostly his)
135
136def makedirs(name, mode=0777):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000137 """makedirs(path [, mode=0777])
Guido van Rossum4def7de1998-07-24 20:48:03 +0000138
139 Super-mkdir; create a leaf directory and all intermediate ones.
140 Works like mkdir, except that any intermediate path segment (not
141 just the rightmost) will be created if it does not exist. This is
142 recursive.
143
144 """
145 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000146 if not tail:
147 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000148 if head and tail and not path.exists(head):
Georg Brandlb1307432006-12-09 09:08:29 +0000149 try:
150 makedirs(head, mode)
151 except OSError, e:
152 # be happy if someone already created the path
Facundo Batista2ffd7802007-11-27 18:50:12 +0000153 if e.errno != errno.EEXIST:
Georg Brandlb1307432006-12-09 09:08:29 +0000154 raise
Andrew M. Kuchling6fccc8a2003-12-23 16:33:28 +0000155 if tail == curdir: # xxx/newdir/. exists if xxx/newdir exists
156 return
Guido van Rossum4def7de1998-07-24 20:48:03 +0000157 mkdir(name, mode)
158
159def removedirs(name):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000160 """removedirs(path)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000161
Fredrik Lundh96c1c7a2005-11-12 15:55:04 +0000162 Super-rmdir; remove a leaf directory and all empty intermediate
Guido van Rossum4def7de1998-07-24 20:48:03 +0000163 ones. Works like rmdir except that, if the leaf directory is
164 successfully removed, directories corresponding to rightmost path
Tim Petersc4e09402003-04-25 07:11:48 +0000165 segments will be pruned away until either the whole path is
Guido van Rossum4def7de1998-07-24 20:48:03 +0000166 consumed or an error occurs. Errors during this latter phase are
167 ignored -- they generally mean that a directory was not empty.
168
169 """
170 rmdir(name)
171 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000172 if not tail:
173 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000174 while head and tail:
175 try:
176 rmdir(head)
177 except error:
178 break
179 head, tail = path.split(head)
180
181def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000182 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000183
184 Super-rename; create directories as necessary and delete any left
185 empty. Works like rename, except creation of any intermediate
186 directories needed to make the new pathname good is attempted
187 first. After the rename, directories corresponding to rightmost
188 path segments of the old name will be pruned way until either the
189 whole path is consumed or a nonempty directory is found.
190
191 Note: this function can fail with the new directory structure made
192 if you lack permissions needed to unlink the leaf directory or
193 file.
194
195 """
196 head, tail = path.split(new)
197 if head and tail and not path.exists(head):
198 makedirs(head)
199 rename(old, new)
200 head, tail = path.split(old)
201 if head and tail:
202 try:
203 removedirs(head)
204 except error:
205 pass
206
Skip Montanaro269b83b2001-02-06 01:07:02 +0000207__all__.extend(["makedirs", "removedirs", "renames"])
208
Georg Brandlcae9f3d2007-03-21 09:10:29 +0000209def walk(top, topdown=True, onerror=None, followlinks=False):
Tim Petersc4e09402003-04-25 07:11:48 +0000210 """Directory tree generator.
211
212 For each directory in the directory tree rooted at top (including top
213 itself, but excluding '.' and '..'), yields a 3-tuple
214
215 dirpath, dirnames, filenames
216
217 dirpath is a string, the path to the directory. dirnames is a list of
218 the names of the subdirectories in dirpath (excluding '.' and '..').
219 filenames is a list of the names of the non-directory files in dirpath.
220 Note that the names in the lists are just names, with no path components.
221 To get a full path (which begins with top) to a file or directory in
222 dirpath, do os.path.join(dirpath, name).
223
224 If optional arg 'topdown' is true or not specified, the triple for a
225 directory is generated before the triples for any of its subdirectories
226 (directories are generated top down). If topdown is false, the triple
227 for a directory is generated after the triples for all of its
228 subdirectories (directories are generated bottom up).
229
230 When topdown is true, the caller can modify the dirnames list in-place
231 (e.g., via del or slice assignment), and walk will only recurse into the
232 subdirectories whose names remain in dirnames; this can be used to prune
233 the search, or to impose a specific order of visiting. Modifying
234 dirnames when topdown is false is ineffective, since the directories in
235 dirnames have already been generated by the time dirnames itself is
236 generated.
237
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000238 By default errors from the os.listdir() call are ignored. If
239 optional arg 'onerror' is specified, it should be a function; it
240 will be called with one argument, an os.error instance. It can
241 report the error to continue with the walk, or raise the exception
242 to abort the walk. Note that the filename is available as the
243 filename attribute of the exception object.
244
Georg Brandlcae9f3d2007-03-21 09:10:29 +0000245 By default, os.walk does not follow symbolic links to subdirectories on
246 systems that support them. In order to get this functionality, set the
247 optional argument 'followlinks' to true.
248
Tim Petersc4e09402003-04-25 07:11:48 +0000249 Caution: if you pass a relative pathname for top, don't change the
250 current working directory between resumptions of walk. walk never
251 changes the current directory, and assumes that the client doesn't
252 either.
253
254 Example:
255
Gregory P. Smith8e499732008-05-06 07:05:18 +0000256 import os
Tim Petersc4e09402003-04-25 07:11:48 +0000257 from os.path import join, getsize
Gregory P. Smith8e499732008-05-06 07:05:18 +0000258 for root, dirs, files in os.walk('python/Lib/email'):
Tim Petersc4e09402003-04-25 07:11:48 +0000259 print root, "consumes",
260 print sum([getsize(join(root, name)) for name in files]),
261 print "bytes in", len(files), "non-directory files"
262 if 'CVS' in dirs:
263 dirs.remove('CVS') # don't visit CVS directories
264 """
265
266 from os.path import join, isdir, islink
267
268 # We may not have read permission for top, in which case we can't
269 # get a list of the files the directory contains. os.path.walk
270 # always suppressed the exception then, rather than blow up for a
271 # minor reason when (say) a thousand readable directories are still
272 # left to visit. That logic is copied here.
273 try:
274 # Note that listdir and error are globals in this module due
275 # to earlier import-*.
276 names = listdir(top)
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000277 except error, err:
278 if onerror is not None:
279 onerror(err)
Tim Petersc4e09402003-04-25 07:11:48 +0000280 return
281
282 dirs, nondirs = [], []
283 for name in names:
284 if isdir(join(top, name)):
285 dirs.append(name)
286 else:
287 nondirs.append(name)
288
289 if topdown:
290 yield top, dirs, nondirs
291 for name in dirs:
292 path = join(top, name)
Georg Brandlcae9f3d2007-03-21 09:10:29 +0000293 if followlinks or not islink(path):
294 for x in walk(path, topdown, onerror, followlinks):
Tim Petersc4e09402003-04-25 07:11:48 +0000295 yield x
296 if not topdown:
297 yield top, dirs, nondirs
298
299__all__.append("walk")
300
Guido van Rossuma28dab51997-08-29 22:36:47 +0000301# Make sure os.environ exists, at least
302try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000303 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000304except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000305 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000306
Guido van Rossume65cce51993-11-08 15:05:21 +0000307def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000308 """execl(file, *args)
309
310 Execute the executable file with argument list args, replacing the
311 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000312 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000313
314def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000315 """execle(file, *args, env)
316
317 Execute the executable file with argument list args and
318 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000319 env = args[-1]
320 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000321
322def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000323 """execlp(file, *args)
324
325 Execute the executable file (which is searched for along $PATH)
326 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000327 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000328
Guido van Rossum030afb11995-03-14 17:27:18 +0000329def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000330 """execlpe(file, *args, env)
331
332 Execute the executable file (which is searched for along $PATH)
333 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000334 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000335 env = args[-1]
336 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000337
Guido van Rossume65cce51993-11-08 15:05:21 +0000338def execvp(file, args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000339 """execp(file, args)
340
341 Execute the executable file (which is searched for along $PATH)
342 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000343 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000344 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000345
346def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000347 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000348
349 Execute the executable file (which is searched for along $PATH)
350 with argument list args and environment env , replacing the
351 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000352 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000353 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000354
Skip Montanaro269b83b2001-02-06 01:07:02 +0000355__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
356
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000357def _execvpe(file, args, env=None):
358 if env is not None:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000359 func = execve
360 argrest = (args, env)
361 else:
362 func = execv
363 argrest = (args,)
364 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000365
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000366 head, tail = path.split(file)
367 if head:
Guido van Rossum68468eb2003-02-27 20:14:51 +0000368 func(file, *argrest)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000369 return
Raymond Hettinger54f02222002-06-01 14:18:47 +0000370 if 'PATH' in env:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000371 envpath = env['PATH']
372 else:
373 envpath = defpath
Guido van Rossum965fdae2000-04-04 19:50:04 +0000374 PATH = envpath.split(pathsep)
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000375 saved_exc = None
376 saved_tb = None
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000377 for dir in PATH:
378 fullname = path.join(dir, file)
379 try:
Guido van Rossum68468eb2003-02-27 20:14:51 +0000380 func(fullname, *argrest)
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000381 except error, e:
382 tb = sys.exc_info()[2]
Facundo Batista2ffd7802007-11-27 18:50:12 +0000383 if (e.errno != errno.ENOENT and e.errno != errno.ENOTDIR
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000384 and saved_exc is None):
385 saved_exc = e
386 saved_tb = tb
387 if saved_exc:
388 raise error, saved_exc, saved_tb
389 raise error, e, tb
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000390
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000391# Change environ to automatically call putenv() if it exists
392try:
393 # This will fail if there's no putenv
394 putenv
395except NameError:
396 pass
397else:
398 import UserDict
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000399
Guido van Rossumc524d952001-10-19 01:31:59 +0000400 # Fake unsetenv() for Windows
Martin v. Löwis8b10f892002-10-09 17:23:29 +0000401 # not sure about os2 here but
Guido van Rossumc524d952001-10-19 01:31:59 +0000402 # I'm guessing they are the same.
403
Martin v. Löwis8b10f892002-10-09 17:23:29 +0000404 if name in ('os2', 'nt'):
Guido van Rossumc524d952001-10-19 01:31:59 +0000405 def unsetenv(key):
406 putenv(key, "")
407
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000408 if name == "riscos":
409 # On RISC OS, all env access goes through getenv and putenv
410 from riscosenviron import _Environ
Martin v. Löwis8b10f892002-10-09 17:23:29 +0000411 elif name in ('os2', 'nt'): # Where Env Var Names Must Be UPPERCASE
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000412 # But we store them as upper case
Raymond Hettingerca2f5372002-09-06 19:36:31 +0000413 class _Environ(UserDict.IterableUserDict):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000414 def __init__(self, environ):
415 UserDict.UserDict.__init__(self)
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000416 data = self.data
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000417 for k, v in environ.items():
Guido van Rossum965fdae2000-04-04 19:50:04 +0000418 data[k.upper()] = v
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000419 def __setitem__(self, key, item):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000420 putenv(key, item)
Guido van Rossum965fdae2000-04-04 19:50:04 +0000421 self.data[key.upper()] = item
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000422 def __getitem__(self, key):
Guido van Rossum965fdae2000-04-04 19:50:04 +0000423 return self.data[key.upper()]
Guido van Rossumc524d952001-10-19 01:31:59 +0000424 try:
425 unsetenv
426 except NameError:
427 def __delitem__(self, key):
428 del self.data[key.upper()]
429 else:
430 def __delitem__(self, key):
431 unsetenv(key)
432 del self.data[key.upper()]
Georg Brandl4a212682007-09-20 17:57:59 +0000433 def clear(self):
434 for key in self.data.keys():
435 unsetenv(key)
436 del self.data[key]
Georg Brandl1a94ec22007-10-24 21:40:38 +0000437 def pop(self, key, *args):
438 unsetenv(key)
Georg Brandldd1a8462007-10-26 18:30:41 +0000439 return self.data.pop(key.upper(), *args)
Guido van Rossumb46413f1999-05-03 15:23:24 +0000440 def has_key(self, key):
Raymond Hettinger54f02222002-06-01 14:18:47 +0000441 return key.upper() in self.data
442 def __contains__(self, key):
443 return key.upper() in self.data
Guido van Rossum965fdae2000-04-04 19:50:04 +0000444 def get(self, key, failobj=None):
445 return self.data.get(key.upper(), failobj)
Martin v. Löwis1d11de62005-01-29 13:29:23 +0000446 def update(self, dict=None, **kwargs):
447 if dict:
448 try:
Martin v. Löwis5510f652005-02-17 21:23:20 +0000449 keys = dict.keys()
Martin v. Löwis1d11de62005-01-29 13:29:23 +0000450 except AttributeError:
451 # List of (key, value)
Martin v. Löwis5510f652005-02-17 21:23:20 +0000452 for k, v in dict:
453 self[k] = v
454 else:
455 # got keys
456 # cannot use items(), since mappings
457 # may not have them.
458 for k in keys:
459 self[k] = dict[k]
Martin v. Löwis1d11de62005-01-29 13:29:23 +0000460 if kwargs:
461 self.update(kwargs)
Martin v. Löwisa066f462002-05-02 17:39:19 +0000462 def copy(self):
463 return dict(self)
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000464
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000465 else: # Where Env Var Names Can Be Mixed Case
Raymond Hettinger05212fc2002-09-07 04:48:03 +0000466 class _Environ(UserDict.IterableUserDict):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000467 def __init__(self, environ):
468 UserDict.UserDict.__init__(self)
469 self.data = environ
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000470 def __setitem__(self, key, item):
471 putenv(key, item)
472 self.data[key] = item
Martin v. Löwis1d11de62005-01-29 13:29:23 +0000473 def update(self, dict=None, **kwargs):
474 if dict:
475 try:
Martin v. Löwis5510f652005-02-17 21:23:20 +0000476 keys = dict.keys()
Martin v. Löwis1d11de62005-01-29 13:29:23 +0000477 except AttributeError:
478 # List of (key, value)
Martin v. Löwis5510f652005-02-17 21:23:20 +0000479 for k, v in dict:
480 self[k] = v
481 else:
482 # got keys
483 # cannot use items(), since mappings
484 # may not have them.
485 for k in keys:
486 self[k] = dict[k]
Martin v. Löwis1d11de62005-01-29 13:29:23 +0000487 if kwargs:
488 self.update(kwargs)
Guido van Rossumc524d952001-10-19 01:31:59 +0000489 try:
490 unsetenv
491 except NameError:
492 pass
493 else:
494 def __delitem__(self, key):
495 unsetenv(key)
496 del self.data[key]
Georg Brandl4a212682007-09-20 17:57:59 +0000497 def clear(self):
498 for key in self.data.keys():
499 unsetenv(key)
500 del self.data[key]
Georg Brandl1a94ec22007-10-24 21:40:38 +0000501 def pop(self, key, *args):
502 unsetenv(key)
503 return self.data.pop(key, *args)
Martin v. Löwisa066f462002-05-02 17:39:19 +0000504 def copy(self):
505 return dict(self)
Tim Peters1633a2e2001-10-30 05:56:40 +0000506
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000507
508 environ = _Environ(environ)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000509
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000510def getenv(key, default=None):
Tim Peters2c60f7a2003-01-29 03:49:43 +0000511 """Get an environment variable, return None if it doesn't exist.
512 The optional second argument can specify an alternate default."""
513 return environ.get(key, default)
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000514__all__.append("getenv")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000515
516def _exists(name):
517 try:
518 eval(name)
Tim Petersbc0e9102002-04-04 22:55:58 +0000519 return True
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000520 except NameError:
Tim Petersbc0e9102002-04-04 22:55:58 +0000521 return False
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000522
523# Supply spawn*() (probably only for Unix)
524if _exists("fork") and not _exists("spawnv") and _exists("execv"):
525
526 P_WAIT = 0
527 P_NOWAIT = P_NOWAITO = 1
528
529 # XXX Should we support P_DETACH? I suppose it could fork()**2
530 # and close the std I/O streams. Also, P_OVERLAY is the same
531 # as execv*()?
532
533 def _spawnvef(mode, file, args, env, func):
534 # Internal helper; func is the exec*() function to use
535 pid = fork()
536 if not pid:
537 # Child
538 try:
539 if env is None:
540 func(file, args)
541 else:
542 func(file, args, env)
543 except:
544 _exit(127)
545 else:
546 # Parent
547 if mode == P_NOWAIT:
548 return pid # Caller is responsible for waiting!
549 while 1:
550 wpid, sts = waitpid(pid, 0)
551 if WIFSTOPPED(sts):
552 continue
553 elif WIFSIGNALED(sts):
554 return -WTERMSIG(sts)
555 elif WIFEXITED(sts):
556 return WEXITSTATUS(sts)
557 else:
558 raise error, "Not stopped, signaled or exited???"
559
560 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000561 """spawnv(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;
Tim Peters2344fae2001-01-15 00:50:52 +0000566otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000567 return _spawnvef(mode, file, args, None, execv)
568
569 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000570 """spawnve(mode, file, args, env) -> integer
571
572Execute file with arguments from args in a subprocess with the
573specified 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 return _spawnvef(mode, file, args, env, execve)
578
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000579 # Note: spawnvp[e] is't currently supported on Windows
580
581 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000582 """spawnvp(mode, file, args) -> integer
583
584Execute file (which is looked for along $PATH) with arguments from
585args in a subprocess.
586If mode == P_NOWAIT return the pid of the process.
587If mode == P_WAIT return the process's exit code if it exits normally;
588otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000589 return _spawnvef(mode, file, args, None, execvp)
590
591 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000592 """spawnvpe(mode, file, args, env) -> integer
593
594Execute file (which is looked for along $PATH) with arguments from
595args in a subprocess with the supplied environment.
596If mode == P_NOWAIT return the pid of the process.
597If mode == P_WAIT return the process's exit code if it exits normally;
598otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000599 return _spawnvef(mode, file, args, env, execvpe)
600
601if _exists("spawnv"):
602 # These aren't supplied by the basic Windows code
603 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000604
605 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000606 """spawnl(mode, file, *args) -> integer
607
608Execute file with arguments from args in a subprocess.
609If mode == P_NOWAIT return the pid of the process.
610If mode == P_WAIT return the process's exit code if it exits normally;
611otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000612 return spawnv(mode, file, args)
613
614 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000615 """spawnle(mode, file, *args, env) -> integer
616
617Execute file with arguments from args in a subprocess with the
618supplied environment.
619If mode == P_NOWAIT return the pid of the process.
620If mode == P_WAIT return the process's exit code if it exits normally;
621otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000622 env = args[-1]
623 return spawnve(mode, file, args[:-1], env)
624
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000625
626 __all__.extend(["spawnv", "spawnve", "spawnl", "spawnle",])
627
628
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000629if _exists("spawnvp"):
630 # At the moment, Windows doesn't implement spawnvp[e],
631 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000632 def spawnlp(mode, file, *args):
Neal Norwitzb7f68102003-07-02 02:49:33 +0000633 """spawnlp(mode, file, *args) -> integer
Guido van Rossume0cd2912000-04-21 18:35:36 +0000634
635Execute file (which is looked for along $PATH) with arguments from
636args in a subprocess with the supplied environment.
637If mode == P_NOWAIT return the pid of the process.
638If mode == P_WAIT return the process's exit code if it exits normally;
639otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000640 return spawnvp(mode, file, args)
641
642 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000643 """spawnlpe(mode, file, *args, env) -> integer
644
645Execute file (which is looked for along $PATH) with arguments from
646args in a subprocess with the supplied environment.
647If mode == P_NOWAIT return the pid of the process.
648If mode == P_WAIT return the process's exit code if it exits normally;
649otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000650 env = args[-1]
651 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000652
653
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000654 __all__.extend(["spawnvp", "spawnvpe", "spawnlp", "spawnlpe",])
Skip Montanaro269b83b2001-02-06 01:07:02 +0000655
656
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000657# Supply popen2 etc. (for Unix)
658if _exists("fork"):
659 if not _exists("popen2"):
660 def popen2(cmd, mode="t", bufsize=-1):
Johannes Gijsbers9fc97892004-10-11 18:12:20 +0000661 """Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd'
662 may be a sequence, in which case arguments will be passed directly to
663 the program without shell intervention (as with os.spawnv()). If 'cmd'
664 is a string it will be passed to the shell (as with os.system()). If
665 'bufsize' is specified, it sets the buffer size for the I/O pipes. The
666 file objects (child_stdin, child_stdout) are returned."""
Neal Norwitz42dd86b2007-05-11 06:57:33 +0000667 import warnings
668 msg = "os.popen2 is deprecated. Use the subprocess module."
669 warnings.warn(msg, DeprecationWarning, stacklevel=2)
670
671 import subprocess
672 PIPE = subprocess.PIPE
673 p = subprocess.Popen(cmd, shell=True, bufsize=bufsize,
674 stdin=PIPE, stdout=PIPE, close_fds=True)
675 return p.stdin, p.stdout
Skip Montanaro269b83b2001-02-06 01:07:02 +0000676 __all__.append("popen2")
Fred Drake31f182e2000-08-28 17:20:05 +0000677
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000678 if not _exists("popen3"):
679 def popen3(cmd, mode="t", bufsize=-1):
Johannes Gijsbers9fc97892004-10-11 18:12:20 +0000680 """Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd'
681 may be a sequence, in which case arguments will be passed directly to
682 the program without shell intervention (as with os.spawnv()). If 'cmd'
683 is a string it will be passed to the shell (as with os.system()). If
684 'bufsize' is specified, it sets the buffer size for the I/O pipes. The
685 file objects (child_stdin, child_stdout, child_stderr) are returned."""
Neal Norwitz42dd86b2007-05-11 06:57:33 +0000686 import warnings
687 msg = "os.popen3 is deprecated. Use the subprocess module."
688 warnings.warn(msg, DeprecationWarning, stacklevel=2)
689
690 import subprocess
691 PIPE = subprocess.PIPE
692 p = subprocess.Popen(cmd, shell=True, bufsize=bufsize,
693 stdin=PIPE, stdout=PIPE, stderr=PIPE,
694 close_fds=True)
695 return p.stdin, p.stdout, p.stderr
Skip Montanaro269b83b2001-02-06 01:07:02 +0000696 __all__.append("popen3")
Fred Drake20af3172000-09-28 19:10:56 +0000697
698 if not _exists("popen4"):
699 def popen4(cmd, mode="t", bufsize=-1):
Johannes Gijsbers9fc97892004-10-11 18:12:20 +0000700 """Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd'
701 may be a sequence, in which case arguments will be passed directly to
702 the program without shell intervention (as with os.spawnv()). If 'cmd'
703 is a string it will be passed to the shell (as with os.system()). If
704 'bufsize' is specified, it sets the buffer size for the I/O pipes. The
705 file objects (child_stdin, child_stdout_stderr) are returned."""
Neal Norwitz42dd86b2007-05-11 06:57:33 +0000706 import warnings
707 msg = "os.popen4 is deprecated. Use the subprocess module."
708 warnings.warn(msg, DeprecationWarning, stacklevel=2)
709
710 import subprocess
711 PIPE = subprocess.PIPE
712 p = subprocess.Popen(cmd, shell=True, bufsize=bufsize,
713 stdin=PIPE, stdout=PIPE,
714 stderr=subprocess.STDOUT, close_fds=True)
715 return p.stdin, p.stdout
Skip Montanaro269b83b2001-02-06 01:07:02 +0000716 __all__.append("popen4")
Michael W. Hudson0e025302002-03-06 17:11:18 +0000717
Georg Brandldffbf5f2008-05-20 07:49:57 +0000718import copy_reg as _copy_reg
Michael W. Hudson0e025302002-03-06 17:11:18 +0000719
720def _make_stat_result(tup, dict):
721 return stat_result(tup, dict)
722
723def _pickle_stat_result(sr):
724 (type, args) = sr.__reduce__()
725 return (_make_stat_result, args)
726
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000727try:
728 _copy_reg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
729except NameError: # stat_result may not exist
730 pass
Michael W. Hudson0e025302002-03-06 17:11:18 +0000731
732def _make_statvfs_result(tup, dict):
733 return statvfs_result(tup, dict)
734
735def _pickle_statvfs_result(sr):
736 (type, args) = sr.__reduce__()
737 return (_make_statvfs_result, args)
738
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000739try:
740 _copy_reg.pickle(statvfs_result, _pickle_statvfs_result,
741 _make_statvfs_result)
Michael W. Hudsone5363b72002-03-15 10:21:59 +0000742except NameError: # statvfs_result may not exist
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000743 pass
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000744
745if not _exists("urandom"):
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000746 def urandom(n):
747 """urandom(n) -> str
Tim Peters45e77c52004-08-29 18:47:31 +0000748
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000749 Return a string of n random bytes suitable for cryptographic use.
750
Tim Peters45e77c52004-08-29 18:47:31 +0000751 """
Georg Brandl9e43acf2005-07-04 17:16:07 +0000752 try:
753 _urandomfd = open("/dev/urandom", O_RDONLY)
Georg Brandl07fec3a2006-08-01 18:49:24 +0000754 except (OSError, IOError):
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000755 raise NotImplementedError("/dev/urandom (or equivalent) not found")
Gregory P. Smithd7122032008-09-02 05:36:11 +0000756 try:
757 bs = b""
758 while n - len(bs) >= 1:
759 bs += read(_urandomfd, n - len(bs))
760 finally:
761 close(_urandomfd)
762 return bs