blob: 48bcea25179dbb0883e33852444b1b6917afea1b [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:
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 Rossum4b8c6ea2000-02-04 15:39:30 +000010 - os.altsep is the alternate pathname separator (None or '/')
Guido van Rossum54f22ed2000-02-04 15:10:34 +000011 - os.pathsep is the component separator used in $PATH etc
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +000012 - os.linesep is the line separator in text files ('\r' or '\n' or '\r\n')
Guido van Rossum54f22ed2000-02-04 15:10:34 +000013 - os.defpath is the default search path for executables
Martin v. Löwisbdec50f2004-06-08 08:29:33 +000014 - os.devnull is the file path of the null device ('/dev/null', etc.)
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",
Martin v. Löwis22b457e2005-01-16 08:40:58 +000031 "defpath", "name", "path", "devnull",
32 "SEEK_SET", "SEEK_CUR", "SEEK_END"]
Skip Montanaro269b83b2001-02-06 01:07:02 +000033
34def _get_exports_list(module):
35 try:
36 return list(module.__all__)
37 except AttributeError:
38 return [n for n in dir(module) if n[0] != '_']
39
Guido van Rossuma28dab51997-08-29 22:36:47 +000040if 'posix' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000041 name = 'posix'
Guido van Rossume9387ea1998-05-22 15:26:04 +000042 linesep = '\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000043 from posix import *
44 try:
45 from posix import _exit
46 except ImportError:
47 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000048 import posixpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000049
Skip Montanaro269b83b2001-02-06 01:07:02 +000050 import posix
51 __all__.extend(_get_exports_list(posix))
52 del posix
53
Guido van Rossuma28dab51997-08-29 22:36:47 +000054elif 'nt' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000055 name = 'nt'
Guido van Rossume9387ea1998-05-22 15:26:04 +000056 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000057 from nt import *
Tim Peters6757c1e2003-01-08 21:20:57 +000058 try:
59 from nt import _exit
60 except ImportError:
61 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000062 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000063
Skip Montanaro269b83b2001-02-06 01:07:02 +000064 import nt
65 __all__.extend(_get_exports_list(nt))
66 del nt
67
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000068elif 'os2' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000069 name = 'os2'
Guido van Rossume9387ea1998-05-22 15:26:04 +000070 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000071 from os2 import *
72 try:
73 from os2 import _exit
74 except ImportError:
75 pass
Andrew MacIntyre5cef5712002-02-24 05:32:32 +000076 if sys.version.find('EMX GCC') == -1:
Skip Montanaro117910d2003-02-14 19:35:31 +000077 import ntpath as path
Andrew MacIntyre5cef5712002-02-24 05:32:32 +000078 else:
Skip Montanaro117910d2003-02-14 19:35:31 +000079 import os2emxpath as path
Andrew MacIntyre89f98652003-12-02 12:33:01 +000080 from _emx_link import link
Tim Petersf2715e02003-02-19 02:35:07 +000081
Skip Montanaro269b83b2001-02-06 01:07:02 +000082 import os2
83 __all__.extend(_get_exports_list(os2))
84 del os2
85
Guido van Rossuma28dab51997-08-29 22:36:47 +000086elif 'mac' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000087 name = 'mac'
Guido van Rossume9387ea1998-05-22 15:26:04 +000088 linesep = '\r'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000089 from mac import *
90 try:
91 from mac import _exit
92 except ImportError:
93 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000094 import macpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000095
Skip Montanaro269b83b2001-02-06 01:07:02 +000096 import mac
97 __all__.extend(_get_exports_list(mac))
98 del mac
99
Guido van Rossum18df5d41999-06-11 01:37:27 +0000100elif 'ce' in _names:
101 name = 'ce'
102 linesep = '\r\n'
Guido van Rossum18df5d41999-06-11 01:37:27 +0000103 from ce import *
Tim Peters6757c1e2003-01-08 21:20:57 +0000104 try:
105 from ce import _exit
106 except ImportError:
107 pass
Guido van Rossum18df5d41999-06-11 01:37:27 +0000108 # We can use the standard Windows path.
Skip Montanaro117910d2003-02-14 19:35:31 +0000109 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +0000110
Skip Montanaro269b83b2001-02-06 01:07:02 +0000111 import ce
112 __all__.extend(_get_exports_list(ce))
113 del ce
114
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000115elif 'riscos' in _names:
116 name = 'riscos'
117 linesep = '\n'
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000118 from riscos import *
119 try:
120 from riscos import _exit
121 except ImportError:
122 pass
Skip Montanaro117910d2003-02-14 19:35:31 +0000123 import riscospath as path
Tim Petersf2715e02003-02-19 02:35:07 +0000124
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000125 import riscos
126 __all__.extend(_get_exports_list(riscos))
Skip Montanaro81e4b1c2001-03-06 15:26:07 +0000127 del riscos
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000128
Guido van Rossum2979b011994-08-01 11:18:30 +0000129else:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000130 raise ImportError, 'no os specific module found'
Guido van Rossume65cce51993-11-08 15:05:21 +0000131
Skip Montanaro117910d2003-02-14 19:35:31 +0000132sys.modules['os.path'] = path
Skip Montanaro7a98be22007-08-16 14:35:24 +0000133from os.path import curdir, pardir, sep, pathsep, defpath, altsep, devnull
Skip Montanaro269b83b2001-02-06 01:07:02 +0000134
Guido van Rossuma28dab51997-08-29 22:36:47 +0000135del _names
136
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000137# Python uses fixed values for the SEEK_ constants; they are mapped
138# to native constants if necessary in posixmodule.c
139SEEK_SET = 0
140SEEK_CUR = 1
141SEEK_END = 2
142
Skip Montanaro269b83b2001-02-06 01:07:02 +0000143#'
144
Guido van Rossum4def7de1998-07-24 20:48:03 +0000145# Super directory utilities.
146# (Inspired by Eric Raymond; the doc strings are mostly his)
147
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000148def makedirs(name, mode=0o777):
149 """makedirs(path [, mode=0o777])
Guido van Rossum4def7de1998-07-24 20:48:03 +0000150
151 Super-mkdir; create a leaf directory and all intermediate ones.
152 Works like mkdir, except that any intermediate path segment (not
153 just the rightmost) will be created if it does not exist. This is
154 recursive.
155
156 """
Thomas Wouters89f507f2006-12-13 04:49:30 +0000157 from errno import EEXIST
Guido van Rossum4def7de1998-07-24 20:48:03 +0000158 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000159 if not tail:
160 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000161 if head and tail and not path.exists(head):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000162 try:
163 makedirs(head, mode)
Guido van Rossumb940e112007-01-10 16:19:56 +0000164 except OSError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000165 # be happy if someone already created the path
166 if e.errno != EEXIST:
167 raise
Andrew M. Kuchling6fccc8a2003-12-23 16:33:28 +0000168 if tail == curdir: # xxx/newdir/. exists if xxx/newdir exists
169 return
Guido van Rossum4def7de1998-07-24 20:48:03 +0000170 mkdir(name, mode)
171
172def removedirs(name):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000173 """removedirs(path)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000174
Fredrik Lundh96c1c7a2005-11-12 15:55:04 +0000175 Super-rmdir; remove a leaf directory and all empty intermediate
Guido van Rossum4def7de1998-07-24 20:48:03 +0000176 ones. Works like rmdir except that, if the leaf directory is
177 successfully removed, directories corresponding to rightmost path
Tim Petersc4e09402003-04-25 07:11:48 +0000178 segments will be pruned away until either the whole path is
Guido van Rossum4def7de1998-07-24 20:48:03 +0000179 consumed or an error occurs. Errors during this latter phase are
180 ignored -- they generally mean that a directory was not empty.
181
182 """
183 rmdir(name)
184 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000185 if not tail:
186 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000187 while head and tail:
188 try:
189 rmdir(head)
190 except error:
191 break
192 head, tail = path.split(head)
193
194def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000195 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000196
197 Super-rename; create directories as necessary and delete any left
198 empty. Works like rename, except creation of any intermediate
199 directories needed to make the new pathname good is attempted
200 first. After the rename, directories corresponding to rightmost
201 path segments of the old name will be pruned way until either the
202 whole path is consumed or a nonempty directory is found.
203
204 Note: this function can fail with the new directory structure made
205 if you lack permissions needed to unlink the leaf directory or
206 file.
207
208 """
209 head, tail = path.split(new)
210 if head and tail and not path.exists(head):
211 makedirs(head)
212 rename(old, new)
213 head, tail = path.split(old)
214 if head and tail:
215 try:
216 removedirs(head)
217 except error:
218 pass
219
Skip Montanaro269b83b2001-02-06 01:07:02 +0000220__all__.extend(["makedirs", "removedirs", "renames"])
221
Guido van Rossumd8faa362007-04-27 19:54:29 +0000222def walk(top, topdown=True, onerror=None, followlinks=False):
Tim Petersc4e09402003-04-25 07:11:48 +0000223 """Directory tree generator.
224
225 For each directory in the directory tree rooted at top (including top
226 itself, but excluding '.' and '..'), yields a 3-tuple
227
228 dirpath, dirnames, filenames
229
230 dirpath is a string, the path to the directory. dirnames is a list of
231 the names of the subdirectories in dirpath (excluding '.' and '..').
232 filenames is a list of the names of the non-directory files in dirpath.
233 Note that the names in the lists are just names, with no path components.
234 To get a full path (which begins with top) to a file or directory in
235 dirpath, do os.path.join(dirpath, name).
236
237 If optional arg 'topdown' is true or not specified, the triple for a
238 directory is generated before the triples for any of its subdirectories
239 (directories are generated top down). If topdown is false, the triple
240 for a directory is generated after the triples for all of its
241 subdirectories (directories are generated bottom up).
242
243 When topdown is true, the caller can modify the dirnames list in-place
244 (e.g., via del or slice assignment), and walk will only recurse into the
245 subdirectories whose names remain in dirnames; this can be used to prune
246 the search, or to impose a specific order of visiting. Modifying
247 dirnames when topdown is false is ineffective, since the directories in
248 dirnames have already been generated by the time dirnames itself is
249 generated.
250
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000251 By default errors from the os.listdir() call are ignored. If
252 optional arg 'onerror' is specified, it should be a function; it
253 will be called with one argument, an os.error instance. It can
254 report the error to continue with the walk, or raise the exception
255 to abort the walk. Note that the filename is available as the
256 filename attribute of the exception object.
257
Guido van Rossumd8faa362007-04-27 19:54:29 +0000258 By default, os.walk does not follow symbolic links to subdirectories on
259 systems that support them. In order to get this functionality, set the
260 optional argument 'followlinks' to true.
261
Tim Petersc4e09402003-04-25 07:11:48 +0000262 Caution: if you pass a relative pathname for top, don't change the
263 current working directory between resumptions of walk. walk never
264 changes the current directory, and assumes that the client doesn't
265 either.
266
267 Example:
268
269 from os.path import join, getsize
270 for root, dirs, files in walk('python/Lib/email'):
271 print root, "consumes",
272 print sum([getsize(join(root, name)) for name in files]),
273 print "bytes in", len(files), "non-directory files"
274 if 'CVS' in dirs:
275 dirs.remove('CVS') # don't visit CVS directories
276 """
277
278 from os.path import join, isdir, islink
279
280 # We may not have read permission for top, in which case we can't
281 # get a list of the files the directory contains. os.path.walk
282 # always suppressed the exception then, rather than blow up for a
283 # minor reason when (say) a thousand readable directories are still
284 # left to visit. That logic is copied here.
285 try:
286 # Note that listdir and error are globals in this module due
287 # to earlier import-*.
288 names = listdir(top)
Guido van Rossumb940e112007-01-10 16:19:56 +0000289 except error as err:
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000290 if onerror is not None:
291 onerror(err)
Tim Petersc4e09402003-04-25 07:11:48 +0000292 return
293
294 dirs, nondirs = [], []
295 for name in names:
296 if isdir(join(top, name)):
297 dirs.append(name)
298 else:
299 nondirs.append(name)
300
301 if topdown:
302 yield top, dirs, nondirs
303 for name in dirs:
304 path = join(top, name)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000305 if followlinks or not islink(path):
306 for x in walk(path, topdown, onerror, followlinks):
Tim Petersc4e09402003-04-25 07:11:48 +0000307 yield x
308 if not topdown:
309 yield top, dirs, nondirs
310
311__all__.append("walk")
312
Guido van Rossuma28dab51997-08-29 22:36:47 +0000313# Make sure os.environ exists, at least
314try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000315 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000316except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000317 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000318
Guido van Rossume65cce51993-11-08 15:05:21 +0000319def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000320 """execl(file, *args)
321
322 Execute the executable file with argument list args, replacing the
323 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000324 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000325
326def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000327 """execle(file, *args, env)
328
329 Execute the executable file with argument list args and
330 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000331 env = args[-1]
332 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000333
334def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000335 """execlp(file, *args)
336
337 Execute the executable file (which is searched for along $PATH)
338 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000339 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000340
Guido van Rossum030afb11995-03-14 17:27:18 +0000341def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000342 """execlpe(file, *args, env)
343
344 Execute the executable file (which is searched for along $PATH)
345 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000346 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000347 env = args[-1]
348 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000349
Guido van Rossume65cce51993-11-08 15:05:21 +0000350def execvp(file, args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000351 """execp(file, args)
352
353 Execute the executable file (which is searched for along $PATH)
354 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000355 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000356 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000357
358def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000359 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000360
361 Execute the executable file (which is searched for along $PATH)
362 with argument list args and environment env , replacing the
363 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000364 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000365 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000366
Skip Montanaro269b83b2001-02-06 01:07:02 +0000367__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
368
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000369def _execvpe(file, args, env=None):
Guido van Rossumaed51d82002-08-05 16:13:24 +0000370 from errno import ENOENT, ENOTDIR
371
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000372 if env is not None:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000373 func = execve
374 argrest = (args, env)
375 else:
376 func = execv
377 argrest = (args,)
378 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000379
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000380 head, tail = path.split(file)
381 if head:
Guido van Rossum68468eb2003-02-27 20:14:51 +0000382 func(file, *argrest)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000383 return
Raymond Hettinger54f02222002-06-01 14:18:47 +0000384 if 'PATH' in env:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000385 envpath = env['PATH']
386 else:
387 envpath = defpath
Guido van Rossum965fdae2000-04-04 19:50:04 +0000388 PATH = envpath.split(pathsep)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000389 last_exc = saved_exc = None
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000390 saved_tb = None
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000391 for dir in PATH:
392 fullname = path.join(dir, file)
393 try:
Guido van Rossum68468eb2003-02-27 20:14:51 +0000394 func(fullname, *argrest)
Guido van Rossumb940e112007-01-10 16:19:56 +0000395 except error as e:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000396 last_exc = e
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000397 tb = sys.exc_info()[2]
398 if (e.errno != ENOENT and e.errno != ENOTDIR
399 and saved_exc is None):
400 saved_exc = e
401 saved_tb = tb
402 if saved_exc:
403 raise error, saved_exc, saved_tb
Guido van Rossume7ba4952007-06-06 23:52:48 +0000404 raise error, last_exc, tb
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000405
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000406
407if name == "riscos":
408 # On RISC OS, all env access goes through getenv and putenv
409 from riscosenviron import _Environ
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000410else:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000411 # Change environ to automatically call putenv(), unsetenv if they exist.
412 from _abcoll import MutableMapping # Can't use collections (bootstrap)
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000413
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000414 class _Environ(MutableMapping):
415 def __init__(self, environ, keymap, putenv, unsetenv):
416 self.keymap = keymap
417 self.putenv = putenv
418 self.unsetenv = unsetenv
419 self.data = data = {}
420 for key, value in environ.items():
Guido van Rossum67aca9e2007-06-13 21:51:27 +0000421 data[keymap(key)] = str(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000422 def __getitem__(self, key):
423 return self.data[self.keymap(key)]
Guido van Rossum67aca9e2007-06-13 21:51:27 +0000424 def __setitem__(self, key, value):
Guido van Rossumf5b46852007-06-13 21:52:41 +0000425 value = str(value)
426 self.putenv(key, value)
427 self.data[self.keymap(key)] = value
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000428 def __delitem__(self, key):
429 self.unsetenv(key)
430 del self.data[self.keymap(key)]
431 def __iter__(self):
432 for key in self.data:
433 yield key
434 def __len__(self):
435 return len(self.data)
436 def copy(self):
437 return dict(self)
438 def setdefault(self, key, value):
439 if key not in self:
Guido van Rossumf5b46852007-06-13 21:52:41 +0000440 self[key] = value
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000441 return self[key]
Guido van Rossumc524d952001-10-19 01:31:59 +0000442
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000443 try:
444 _putenv = putenv
445 except NameError:
446 _putenv = lambda key, value: None
447 else:
448 __all__.append("putenv")
Guido van Rossumc524d952001-10-19 01:31:59 +0000449
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000450 try:
451 _unsetenv = unsetenv
452 except NameError:
453 _unsetenv = lambda key: _putenv(key, "")
454 else:
455 __all__.append("unsetenv")
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000456
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000457 if name in ('os2', 'nt'): # Where Env Var Names Must Be UPPERCASE
Guido van Rossum67aca9e2007-06-13 21:51:27 +0000458 _keymap = lambda key: str(key.upper())
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000459 else: # Where Env Var Names Can Be Mixed Case
Guido van Rossum67aca9e2007-06-13 21:51:27 +0000460 _keymap = lambda key: str(key)
Tim Peters1633a2e2001-10-30 05:56:40 +0000461
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000462 environ = _Environ(environ, _keymap, _putenv, _unsetenv)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000463
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
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000580
581 __all__.extend(["spawnv", "spawnve", "spawnl", "spawnle",])
582
583
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000584if _exists("spawnvp"):
585 # At the moment, Windows doesn't implement spawnvp[e],
586 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000587 def spawnlp(mode, file, *args):
Neal Norwitzb7f68102003-07-02 02:49:33 +0000588 """spawnlp(mode, file, *args) -> integer
Guido van Rossume0cd2912000-04-21 18:35:36 +0000589
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 Rossum5a2ca931999-11-02 13:27:32 +0000595 return spawnvp(mode, file, args)
596
597 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000598 """spawnlpe(mode, file, *args, env) -> integer
599
600Execute file (which is looked for along $PATH) with arguments from
601args in a subprocess with the supplied environment.
602If mode == P_NOWAIT return the pid of the process.
603If mode == P_WAIT return the process's exit code if it exits normally;
604otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000605 env = args[-1]
606 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000607
608
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000609 __all__.extend(["spawnvp", "spawnvpe", "spawnlp", "spawnlpe",])
Skip Montanaro269b83b2001-02-06 01:07:02 +0000610
Michael W. Hudson0e025302002-03-06 17:11:18 +0000611import copy_reg as _copy_reg
612
613def _make_stat_result(tup, dict):
614 return stat_result(tup, dict)
615
616def _pickle_stat_result(sr):
617 (type, args) = sr.__reduce__()
618 return (_make_stat_result, args)
619
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000620try:
621 _copy_reg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
622except NameError: # stat_result may not exist
623 pass
Michael W. Hudson0e025302002-03-06 17:11:18 +0000624
625def _make_statvfs_result(tup, dict):
626 return statvfs_result(tup, dict)
627
628def _pickle_statvfs_result(sr):
629 (type, args) = sr.__reduce__()
630 return (_make_statvfs_result, args)
631
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000632try:
633 _copy_reg.pickle(statvfs_result, _pickle_statvfs_result,
634 _make_statvfs_result)
Michael W. Hudsone5363b72002-03-15 10:21:59 +0000635except NameError: # statvfs_result may not exist
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000636 pass
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000637
638if not _exists("urandom"):
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000639 def urandom(n):
640 """urandom(n) -> str
Tim Peters45e77c52004-08-29 18:47:31 +0000641
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000642 Return a string of n random bytes suitable for cryptographic use.
643
Tim Peters45e77c52004-08-29 18:47:31 +0000644 """
Georg Brandl9e43acf2005-07-04 17:16:07 +0000645 try:
646 _urandomfd = open("/dev/urandom", O_RDONLY)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000647 except (OSError, IOError):
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000648 raise NotImplementedError("/dev/urandom (or equivalent) not found")
Guido van Rossum572dbf82007-04-27 23:53:51 +0000649 bs = b""
650 while len(bs) < n:
651 bs += read(_urandomfd, n - len(bs))
Georg Brandl9e43acf2005-07-04 17:16:07 +0000652 close(_urandomfd)
Guido van Rossum572dbf82007-04-27 23:53:51 +0000653 return bs
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000654
655# Supply os.popen()
656def popen(cmd, mode="r", buffering=None):
657 if not isinstance(cmd, basestring):
658 raise TypeError("invalid cmd type (%s, expected string)" % type(cmd))
659 if mode not in ("r", "w"):
660 raise ValueError("invalid mode %r" % mode)
661 import subprocess, io
662 if mode == "r":
663 proc = subprocess.Popen(cmd,
664 shell=True,
665 stdout=subprocess.PIPE,
666 bufsize=buffering)
667 return _wrap_close(io.TextIOWrapper(proc.stdout), proc)
668 else:
669 proc = subprocess.Popen(cmd,
670 shell=True,
671 stdin=subprocess.PIPE,
672 bufsize=buffering)
673 return _wrap_close(io.TextIOWrapper(proc.stdin), proc)
674
675# Helper for popen() -- a proxy for a file whose close waits for the process
676class _wrap_close:
677 def __init__(self, stream, proc):
678 self._stream = stream
679 self._proc = proc
680 def close(self):
681 self._stream.close()
682 return self._proc.wait() << 8 # Shift left to match old behavior
683 def __getattr__(self, name):
684 return getattr(self._stream, name)
685
686# Supply os.fdopen() (used by subprocess!)
687def fdopen(fd, mode="r", buffering=-1):
688 if not isinstance(fd, int):
689 raise TypeError("invalid fd type (%s, expected integer)" % type(fd))
690 import io
691 return io.open(fd, mode, buffering)