blob: 12ebbcb517caed1501f7610913c09c137da5c81c [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
Benjamin Peterson246ec332009-11-20 02:56:43 +0000266 islink, join, isdir = path.islink, path.join, path.isdir
Tim Petersc4e09402003-04-25 07:11:48 +0000267
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:
Benjamin Peterson246ec332009-11-20 02:56:43 +0000292 new_path = join(top, name)
293 if followlinks or not islink(new_path):
294 for x in walk(new_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):
Amaury Forgeot d'Arc03dcc732009-06-09 22:53:16 +0000517 return name in globals()
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000518
519# Supply spawn*() (probably only for Unix)
520if _exists("fork") and not _exists("spawnv") and _exists("execv"):
521
522 P_WAIT = 0
523 P_NOWAIT = P_NOWAITO = 1
524
525 # XXX Should we support P_DETACH? I suppose it could fork()**2
526 # and close the std I/O streams. Also, P_OVERLAY is the same
527 # as execv*()?
528
529 def _spawnvef(mode, file, args, env, func):
530 # Internal helper; func is the exec*() function to use
531 pid = fork()
532 if not pid:
533 # Child
534 try:
535 if env is None:
536 func(file, args)
537 else:
538 func(file, args, env)
539 except:
540 _exit(127)
541 else:
542 # Parent
543 if mode == P_NOWAIT:
544 return pid # Caller is responsible for waiting!
545 while 1:
546 wpid, sts = waitpid(pid, 0)
547 if WIFSTOPPED(sts):
548 continue
549 elif WIFSIGNALED(sts):
550 return -WTERMSIG(sts)
551 elif WIFEXITED(sts):
552 return WEXITSTATUS(sts)
553 else:
554 raise error, "Not stopped, signaled or exited???"
555
556 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000557 """spawnv(mode, file, args) -> integer
558
559Execute file with arguments from args in a subprocess.
560If mode == P_NOWAIT return the pid of the process.
561If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000562otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000563 return _spawnvef(mode, file, args, None, execv)
564
565 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000566 """spawnve(mode, file, args, env) -> integer
567
568Execute file with arguments from args in a subprocess with the
569specified 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 return _spawnvef(mode, file, args, env, execve)
574
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000575 # Note: spawnvp[e] is't currently supported on Windows
576
577 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000578 """spawnvp(mode, file, args) -> integer
579
580Execute file (which is looked for along $PATH) with arguments from
581args in a subprocess.
582If mode == P_NOWAIT return the pid of the process.
583If mode == P_WAIT return the process's exit code if it exits normally;
584otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000585 return _spawnvef(mode, file, args, None, execvp)
586
587 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000588 """spawnvpe(mode, file, args, env) -> integer
589
590Execute file (which is looked for along $PATH) with arguments from
591args in a subprocess with the supplied environment.
592If mode == P_NOWAIT return the pid of the process.
593If mode == P_WAIT return the process's exit code if it exits normally;
594otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000595 return _spawnvef(mode, file, args, env, execvpe)
596
597if _exists("spawnv"):
598 # These aren't supplied by the basic Windows code
599 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000600
601 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000602 """spawnl(mode, file, *args) -> integer
603
604Execute file with arguments from args in a subprocess.
605If mode == P_NOWAIT return the pid of the process.
606If mode == P_WAIT return the process's exit code if it exits normally;
607otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000608 return spawnv(mode, file, args)
609
610 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000611 """spawnle(mode, file, *args, env) -> integer
612
613Execute file with arguments from args in a subprocess with the
614supplied environment.
615If mode == P_NOWAIT return the pid of the process.
616If mode == P_WAIT return the process's exit code if it exits normally;
617otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000618 env = args[-1]
619 return spawnve(mode, file, args[:-1], env)
620
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000621
622 __all__.extend(["spawnv", "spawnve", "spawnl", "spawnle",])
623
624
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000625if _exists("spawnvp"):
626 # At the moment, Windows doesn't implement spawnvp[e],
627 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000628 def spawnlp(mode, file, *args):
Neal Norwitzb7f68102003-07-02 02:49:33 +0000629 """spawnlp(mode, file, *args) -> integer
Guido van Rossume0cd2912000-04-21 18:35:36 +0000630
631Execute file (which is looked for along $PATH) with arguments from
632args in a subprocess with the supplied environment.
633If mode == P_NOWAIT return the pid of the process.
634If mode == P_WAIT return the process's exit code if it exits normally;
635otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000636 return spawnvp(mode, file, args)
637
638 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000639 """spawnlpe(mode, file, *args, env) -> integer
640
641Execute file (which is looked for along $PATH) with arguments from
642args in a subprocess with the supplied environment.
643If mode == P_NOWAIT return the pid of the process.
644If mode == P_WAIT return the process's exit code if it exits normally;
645otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000646 env = args[-1]
647 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000648
649
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000650 __all__.extend(["spawnvp", "spawnvpe", "spawnlp", "spawnlpe",])
Skip Montanaro269b83b2001-02-06 01:07:02 +0000651
652
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000653# Supply popen2 etc. (for Unix)
654if _exists("fork"):
655 if not _exists("popen2"):
656 def popen2(cmd, mode="t", bufsize=-1):
Johannes Gijsbers9fc97892004-10-11 18:12:20 +0000657 """Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd'
658 may be a sequence, in which case arguments will be passed directly to
659 the program without shell intervention (as with os.spawnv()). If 'cmd'
660 is a string it will be passed to the shell (as with os.system()). If
661 'bufsize' is specified, it sets the buffer size for the I/O pipes. The
662 file objects (child_stdin, child_stdout) are returned."""
Neal Norwitz42dd86b2007-05-11 06:57:33 +0000663 import warnings
664 msg = "os.popen2 is deprecated. Use the subprocess module."
665 warnings.warn(msg, DeprecationWarning, stacklevel=2)
666
667 import subprocess
668 PIPE = subprocess.PIPE
Philip Jenvey8b902042009-09-29 19:10:15 +0000669 p = subprocess.Popen(cmd, shell=isinstance(cmd, basestring),
670 bufsize=bufsize, stdin=PIPE, stdout=PIPE,
671 close_fds=True)
Neal Norwitz42dd86b2007-05-11 06:57:33 +0000672 return p.stdin, p.stdout
Skip Montanaro269b83b2001-02-06 01:07:02 +0000673 __all__.append("popen2")
Fred Drake31f182e2000-08-28 17:20:05 +0000674
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000675 if not _exists("popen3"):
676 def popen3(cmd, mode="t", bufsize=-1):
Johannes Gijsbers9fc97892004-10-11 18:12:20 +0000677 """Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd'
678 may be a sequence, in which case arguments will be passed directly to
679 the program without shell intervention (as with os.spawnv()). If 'cmd'
680 is a string it will be passed to the shell (as with os.system()). If
681 'bufsize' is specified, it sets the buffer size for the I/O pipes. The
682 file objects (child_stdin, child_stdout, child_stderr) are returned."""
Neal Norwitz42dd86b2007-05-11 06:57:33 +0000683 import warnings
684 msg = "os.popen3 is deprecated. Use the subprocess module."
685 warnings.warn(msg, DeprecationWarning, stacklevel=2)
686
687 import subprocess
688 PIPE = subprocess.PIPE
Philip Jenvey8b902042009-09-29 19:10:15 +0000689 p = subprocess.Popen(cmd, shell=isinstance(cmd, basestring),
690 bufsize=bufsize, stdin=PIPE, stdout=PIPE,
691 stderr=PIPE, close_fds=True)
Neal Norwitz42dd86b2007-05-11 06:57:33 +0000692 return p.stdin, p.stdout, p.stderr
Skip Montanaro269b83b2001-02-06 01:07:02 +0000693 __all__.append("popen3")
Fred Drake20af3172000-09-28 19:10:56 +0000694
695 if not _exists("popen4"):
696 def popen4(cmd, mode="t", bufsize=-1):
Johannes Gijsbers9fc97892004-10-11 18:12:20 +0000697 """Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd'
698 may be a sequence, in which case arguments will be passed directly to
699 the program without shell intervention (as with os.spawnv()). If 'cmd'
700 is a string it will be passed to the shell (as with os.system()). If
701 'bufsize' is specified, it sets the buffer size for the I/O pipes. The
702 file objects (child_stdin, child_stdout_stderr) are returned."""
Neal Norwitz42dd86b2007-05-11 06:57:33 +0000703 import warnings
704 msg = "os.popen4 is deprecated. Use the subprocess module."
705 warnings.warn(msg, DeprecationWarning, stacklevel=2)
706
707 import subprocess
708 PIPE = subprocess.PIPE
Philip Jenvey8b902042009-09-29 19:10:15 +0000709 p = subprocess.Popen(cmd, shell=isinstance(cmd, basestring),
710 bufsize=bufsize, stdin=PIPE, stdout=PIPE,
Neal Norwitz42dd86b2007-05-11 06:57:33 +0000711 stderr=subprocess.STDOUT, close_fds=True)
712 return p.stdin, p.stdout
Skip Montanaro269b83b2001-02-06 01:07:02 +0000713 __all__.append("popen4")
Michael W. Hudson0e025302002-03-06 17:11:18 +0000714
Georg Brandldffbf5f2008-05-20 07:49:57 +0000715import copy_reg as _copy_reg
Michael W. Hudson0e025302002-03-06 17:11:18 +0000716
717def _make_stat_result(tup, dict):
718 return stat_result(tup, dict)
719
720def _pickle_stat_result(sr):
721 (type, args) = sr.__reduce__()
722 return (_make_stat_result, args)
723
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000724try:
725 _copy_reg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
726except NameError: # stat_result may not exist
727 pass
Michael W. Hudson0e025302002-03-06 17:11:18 +0000728
729def _make_statvfs_result(tup, dict):
730 return statvfs_result(tup, dict)
731
732def _pickle_statvfs_result(sr):
733 (type, args) = sr.__reduce__()
734 return (_make_statvfs_result, args)
735
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000736try:
737 _copy_reg.pickle(statvfs_result, _pickle_statvfs_result,
738 _make_statvfs_result)
Michael W. Hudsone5363b72002-03-15 10:21:59 +0000739except NameError: # statvfs_result may not exist
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000740 pass
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000741
742if not _exists("urandom"):
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000743 def urandom(n):
744 """urandom(n) -> str
Tim Peters45e77c52004-08-29 18:47:31 +0000745
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000746 Return a string of n random bytes suitable for cryptographic use.
747
Tim Peters45e77c52004-08-29 18:47:31 +0000748 """
Georg Brandl9e43acf2005-07-04 17:16:07 +0000749 try:
750 _urandomfd = open("/dev/urandom", O_RDONLY)
Georg Brandl07fec3a2006-08-01 18:49:24 +0000751 except (OSError, IOError):
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000752 raise NotImplementedError("/dev/urandom (or equivalent) not found")
Gregory P. Smithd7122032008-09-02 05:36:11 +0000753 try:
754 bs = b""
Mark Dickinson1b34d252010-01-01 17:27:30 +0000755 while n > len(bs):
Gregory P. Smithd7122032008-09-02 05:36:11 +0000756 bs += read(_urandomfd, n - len(bs))
757 finally:
758 close(_urandomfd)
759 return bs