blob: cdc2a66b48c68682320fc8841f2626b5fd6b16e6 [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:
Alexandre Vassalottieca20b62008-05-16 02:54:33 +00004 - all functions from posix, nt, os2, or ce, e.g. unlink, stat, etc.
5 - os.path is either posixpath or ntpath
6 - os.name is either 'posix', 'nt', 'os2' or 'ce'.
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 '\\')
Georg Brandled5b9b32008-12-05 07:45:54 +000010 - os.extsep is the extension separator (always '.')
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
Christian Heimes45f9af32007-11-27 21:50:00 +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 Cannon13962fc2008-08-18 01:45:29 +000031__all__ = ["altsep", "curdir", "pardir", "sep", "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 Rossum2979b011994-08-01 11:18:30 +0000102else:
Collin Winter828f04a2007-08-31 00:04:24 +0000103 raise ImportError('no os specific module found')
Guido van Rossume65cce51993-11-08 15:05:21 +0000104
Skip Montanaro117910d2003-02-14 19:35:31 +0000105sys.modules['os.path'] = path
Georg Brandled5b9b32008-12-05 07:45:54 +0000106from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep,
107 devnull)
Skip Montanaro269b83b2001-02-06 01:07:02 +0000108
Guido van Rossuma28dab51997-08-29 22:36:47 +0000109del _names
110
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000111# Python uses fixed values for the SEEK_ constants; they are mapped
112# to native constants if necessary in posixmodule.c
113SEEK_SET = 0
114SEEK_CUR = 1
115SEEK_END = 2
116
Skip Montanaro269b83b2001-02-06 01:07:02 +0000117#'
118
Guido van Rossum4def7de1998-07-24 20:48:03 +0000119# Super directory utilities.
120# (Inspired by Eric Raymond; the doc strings are mostly his)
121
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000122def makedirs(name, mode=0o777):
123 """makedirs(path [, mode=0o777])
Guido van Rossum4def7de1998-07-24 20:48:03 +0000124
125 Super-mkdir; create a leaf directory and all intermediate ones.
126 Works like mkdir, except that any intermediate path segment (not
127 just the rightmost) will be created if it does not exist. This is
128 recursive.
129
130 """
131 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000132 if not tail:
133 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000134 if head and tail and not path.exists(head):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000135 try:
136 makedirs(head, mode)
Guido van Rossumb940e112007-01-10 16:19:56 +0000137 except OSError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000138 # be happy if someone already created the path
Christian Heimes45f9af32007-11-27 21:50:00 +0000139 if e.errno != errno.EEXIST:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000140 raise
Andrew M. Kuchling6fccc8a2003-12-23 16:33:28 +0000141 if tail == curdir: # xxx/newdir/. exists if xxx/newdir exists
142 return
Guido van Rossum4def7de1998-07-24 20:48:03 +0000143 mkdir(name, mode)
144
145def removedirs(name):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000146 """removedirs(path)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000147
Fredrik Lundh96c1c7a2005-11-12 15:55:04 +0000148 Super-rmdir; remove a leaf directory and all empty intermediate
Guido van Rossum4def7de1998-07-24 20:48:03 +0000149 ones. Works like rmdir except that, if the leaf directory is
150 successfully removed, directories corresponding to rightmost path
Tim Petersc4e09402003-04-25 07:11:48 +0000151 segments will be pruned away until either the whole path is
Guido van Rossum4def7de1998-07-24 20:48:03 +0000152 consumed or an error occurs. Errors during this latter phase are
153 ignored -- they generally mean that a directory was not empty.
154
155 """
156 rmdir(name)
157 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000158 if not tail:
159 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000160 while head and tail:
161 try:
162 rmdir(head)
163 except error:
164 break
165 head, tail = path.split(head)
166
167def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000168 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000169
170 Super-rename; create directories as necessary and delete any left
171 empty. Works like rename, except creation of any intermediate
172 directories needed to make the new pathname good is attempted
173 first. After the rename, directories corresponding to rightmost
174 path segments of the old name will be pruned way until either the
175 whole path is consumed or a nonempty directory is found.
176
177 Note: this function can fail with the new directory structure made
178 if you lack permissions needed to unlink the leaf directory or
179 file.
180
181 """
182 head, tail = path.split(new)
183 if head and tail and not path.exists(head):
184 makedirs(head)
185 rename(old, new)
186 head, tail = path.split(old)
187 if head and tail:
188 try:
189 removedirs(head)
190 except error:
191 pass
192
Skip Montanaro269b83b2001-02-06 01:07:02 +0000193__all__.extend(["makedirs", "removedirs", "renames"])
194
Guido van Rossumd8faa362007-04-27 19:54:29 +0000195def walk(top, topdown=True, onerror=None, followlinks=False):
Tim Petersc4e09402003-04-25 07:11:48 +0000196 """Directory tree generator.
197
198 For each directory in the directory tree rooted at top (including top
199 itself, but excluding '.' and '..'), yields a 3-tuple
200
201 dirpath, dirnames, filenames
202
203 dirpath is a string, the path to the directory. dirnames is a list of
204 the names of the subdirectories in dirpath (excluding '.' and '..').
205 filenames is a list of the names of the non-directory files in dirpath.
206 Note that the names in the lists are just names, with no path components.
207 To get a full path (which begins with top) to a file or directory in
208 dirpath, do os.path.join(dirpath, name).
209
210 If optional arg 'topdown' is true or not specified, the triple for a
211 directory is generated before the triples for any of its subdirectories
212 (directories are generated top down). If topdown is false, the triple
213 for a directory is generated after the triples for all of its
214 subdirectories (directories are generated bottom up).
215
216 When topdown is true, the caller can modify the dirnames list in-place
217 (e.g., via del or slice assignment), and walk will only recurse into the
218 subdirectories whose names remain in dirnames; this can be used to prune
219 the search, or to impose a specific order of visiting. Modifying
220 dirnames when topdown is false is ineffective, since the directories in
221 dirnames have already been generated by the time dirnames itself is
222 generated.
223
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000224 By default errors from the os.listdir() call are ignored. If
225 optional arg 'onerror' is specified, it should be a function; it
226 will be called with one argument, an os.error instance. It can
227 report the error to continue with the walk, or raise the exception
228 to abort the walk. Note that the filename is available as the
229 filename attribute of the exception object.
230
Guido van Rossumd8faa362007-04-27 19:54:29 +0000231 By default, os.walk does not follow symbolic links to subdirectories on
232 systems that support them. In order to get this functionality, set the
233 optional argument 'followlinks' to true.
234
Tim Petersc4e09402003-04-25 07:11:48 +0000235 Caution: if you pass a relative pathname for top, don't change the
236 current working directory between resumptions of walk. walk never
237 changes the current directory, and assumes that the client doesn't
238 either.
239
240 Example:
241
Christian Heimes5d8da202008-05-06 13:58:24 +0000242 import os
Tim Petersc4e09402003-04-25 07:11:48 +0000243 from os.path import join, getsize
Christian Heimes5d8da202008-05-06 13:58:24 +0000244 for root, dirs, files in os.walk('python/Lib/email'):
Neal Norwitz752abd02008-05-13 04:55:24 +0000245 print(root, "consumes", end="")
246 print(sum([getsize(join(root, name)) for name in files]), end="")
247 print("bytes in", len(files), "non-directory files")
Tim Petersc4e09402003-04-25 07:11:48 +0000248 if 'CVS' in dirs:
249 dirs.remove('CVS') # don't visit CVS directories
250 """
251
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000252 islink, join, isdir = path.islink, path.join, path.isdir
Tim Petersc4e09402003-04-25 07:11:48 +0000253
254 # We may not have read permission for top, in which case we can't
Alexandre Vassalotti4e6531e2008-05-09 20:00:17 +0000255 # get a list of the files the directory contains. os.walk
Tim Petersc4e09402003-04-25 07:11:48 +0000256 # always suppressed the exception then, rather than blow up for a
257 # minor reason when (say) a thousand readable directories are still
258 # left to visit. That logic is copied here.
259 try:
260 # Note that listdir and error are globals in this module due
261 # to earlier import-*.
262 names = listdir(top)
Guido van Rossumb940e112007-01-10 16:19:56 +0000263 except error as err:
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000264 if onerror is not None:
265 onerror(err)
Tim Petersc4e09402003-04-25 07:11:48 +0000266 return
267
268 dirs, nondirs = [], []
269 for name in names:
270 if isdir(join(top, name)):
271 dirs.append(name)
272 else:
273 nondirs.append(name)
274
275 if topdown:
276 yield top, dirs, nondirs
277 for name in dirs:
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000278 new_path = join(top, name)
279 if followlinks or not islink(new_path):
280 for x in walk(new_path, topdown, onerror, followlinks):
Tim Petersc4e09402003-04-25 07:11:48 +0000281 yield x
282 if not topdown:
283 yield top, dirs, nondirs
284
285__all__.append("walk")
286
Guido van Rossuma28dab51997-08-29 22:36:47 +0000287# Make sure os.environ exists, at least
288try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000289 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000290except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000291 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000292
Guido van Rossume65cce51993-11-08 15:05:21 +0000293def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000294 """execl(file, *args)
295
296 Execute the executable file with argument list args, replacing the
297 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000298 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000299
300def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000301 """execle(file, *args, env)
302
303 Execute the executable file with argument list args and
304 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000305 env = args[-1]
306 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000307
308def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000309 """execlp(file, *args)
310
311 Execute the executable file (which is searched for along $PATH)
312 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000313 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000314
Guido van Rossum030afb11995-03-14 17:27:18 +0000315def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000316 """execlpe(file, *args, env)
317
318 Execute the executable file (which is searched for along $PATH)
319 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000320 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000321 env = args[-1]
322 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000323
Guido van Rossume65cce51993-11-08 15:05:21 +0000324def execvp(file, args):
Matthias Klosea09c54f2010-01-31 16:48:44 +0000325 """execvp(file, args)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000326
327 Execute the executable file (which is searched for along $PATH)
328 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000329 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000330 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000331
332def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000333 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000334
335 Execute the executable file (which is searched for along $PATH)
336 with argument list args and environment env , replacing the
337 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000338 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000339 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000340
Skip Montanaro269b83b2001-02-06 01:07:02 +0000341__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
342
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000343def _execvpe(file, args, env=None):
344 if env is not None:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000345 exec_func = execve
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000346 argrest = (args, env)
347 else:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000348 exec_func = execv
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000349 argrest = (args,)
350 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000351
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000352 head, tail = path.split(file)
353 if head:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000354 exec_func(file, *argrest)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000355 return
Guido van Rossume7ba4952007-06-06 23:52:48 +0000356 last_exc = saved_exc = None
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000357 saved_tb = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000358 path_list = get_exec_path(env)
359 if name != 'nt':
360 file = fsencode(file)
361 path_list = map(fsencode, path_list)
362 for dir in path_list:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000363 fullname = path.join(dir, file)
364 try:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000365 exec_func(fullname, *argrest)
Guido van Rossumb940e112007-01-10 16:19:56 +0000366 except error as e:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000367 last_exc = e
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000368 tb = sys.exc_info()[2]
Christian Heimes45f9af32007-11-27 21:50:00 +0000369 if (e.errno != errno.ENOENT and e.errno != errno.ENOTDIR
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000370 and saved_exc is None):
371 saved_exc = e
372 saved_tb = tb
373 if saved_exc:
Benjamin Peterson4b068192009-02-20 03:19:25 +0000374 raise saved_exc.with_traceback(saved_tb)
375 raise last_exc.with_traceback(tb)
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000376
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000377
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000378def get_exec_path(env=None):
379 """Returns the sequence of directories that will be searched for the
380 named executable (similar to a shell) when launching a process.
381
382 *env* must be an environment variable dict or None. If *env* is None,
383 os.environ will be used.
384 """
Victor Stinner6f35eda2010-10-29 00:38:58 +0000385 # Use a local import instead of a global import to avoid bootstrap issue:
386 # the os module is used to build Python extensions.
387 import warnings
388
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000389 if env is None:
390 env = environ
Victor Stinnerb745a742010-05-18 17:17:23 +0000391
392 try:
Victor Stinner6f35eda2010-10-29 00:38:58 +0000393 # ignore BytesWarning warning
394 with warnings.catch_warnings(record=True):
395 path_list = env.get('PATH')
Victor Stinner38430e22010-08-19 17:10:18 +0000396 except (TypeError, BytesWarning):
Victor Stinner6f35eda2010-10-29 00:38:58 +0000397 # A BytesWarning here means that env has a b'PATH' key, but no 'PATH'
398 # key. Compare bytes and str raises a BytesWarning exception only if
399 # sys.flags.bytes_warning==2, and in this case it is not possible to
400 # create a dictionary with both keys.
Victor Stinnerb745a742010-05-18 17:17:23 +0000401 path_list = None
402
403 if supports_bytes_environ:
404 try:
Victor Stinner6f35eda2010-10-29 00:38:58 +0000405 # ignore BytesWarning warning
406 with warnings.catch_warnings(record=True):
407 path_listb = env[b'PATH']
Victor Stinner38430e22010-08-19 17:10:18 +0000408 except (KeyError, TypeError, BytesWarning):
Victor Stinner6f35eda2010-10-29 00:38:58 +0000409 # A BytesWarning here means that env has a 'PATH' key, but no
410 # b'PATH' key. See the comment above for an explaination.
Victor Stinnerb745a742010-05-18 17:17:23 +0000411 pass
412 else:
413 if path_list is not None:
414 raise ValueError(
415 "env cannot contain 'PATH' and b'PATH' keys")
416 path_list = path_listb
417
418 if path_list is not None and isinstance(path_list, bytes):
Victor Stinnere8d51452010-08-19 01:05:19 +0000419 path_list = fsdecode(path_list)
Victor Stinnerb745a742010-05-18 17:17:23 +0000420
421 if path_list is None:
422 path_list = defpath
423 return path_list.split(pathsep)
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000424
425
Skip Montanaro289bc052007-08-17 02:30:27 +0000426# Change environ to automatically call putenv(), unsetenv if they exist.
427from _abcoll import MutableMapping # Can't use collections (bootstrap)
428
429class _Environ(MutableMapping):
Victor Stinner84ae1182010-05-06 22:05:07 +0000430 def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv):
431 self.encodekey = encodekey
432 self.decodekey = decodekey
433 self.encodevalue = encodevalue
434 self.decodevalue = decodevalue
Skip Montanaro289bc052007-08-17 02:30:27 +0000435 self.putenv = putenv
436 self.unsetenv = unsetenv
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000437 self._data = data
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000438
Skip Montanaro289bc052007-08-17 02:30:27 +0000439 def __getitem__(self, key):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000440 value = self._data[self.encodekey(key)]
Victor Stinner84ae1182010-05-06 22:05:07 +0000441 return self.decodevalue(value)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000442
Skip Montanaro289bc052007-08-17 02:30:27 +0000443 def __setitem__(self, key, value):
Victor Stinner84ae1182010-05-06 22:05:07 +0000444 key = self.encodekey(key)
445 value = self.encodevalue(value)
Skip Montanaro289bc052007-08-17 02:30:27 +0000446 self.putenv(key, value)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000447 self._data[key] = value
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000448
Skip Montanaro289bc052007-08-17 02:30:27 +0000449 def __delitem__(self, key):
Victor Stinner84ae1182010-05-06 22:05:07 +0000450 key = self.encodekey(key)
Skip Montanaro289bc052007-08-17 02:30:27 +0000451 self.unsetenv(key)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000452 del self._data[key]
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000453
Skip Montanaro289bc052007-08-17 02:30:27 +0000454 def __iter__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000455 for key in self._data:
Victor Stinner84ae1182010-05-06 22:05:07 +0000456 yield self.decodekey(key)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000457
Skip Montanaro289bc052007-08-17 02:30:27 +0000458 def __len__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000459 return len(self._data)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000460
461 def __repr__(self):
Victor Stinnerbed71172010-07-28 21:25:42 +0000462 return 'environ({{{}}})'.format(', '.join(
Victor Stinnerd73c1a32010-07-28 21:23:23 +0000463 ('{!r}: {!r}'.format(self.decodekey(key), self.decodevalue(value))
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000464 for key, value in self._data.items())))
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000465
Skip Montanaro289bc052007-08-17 02:30:27 +0000466 def copy(self):
467 return dict(self)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000468
Skip Montanaro289bc052007-08-17 02:30:27 +0000469 def setdefault(self, key, value):
470 if key not in self:
471 self[key] = value
472 return self[key]
473
474try:
475 _putenv = putenv
476except NameError:
477 _putenv = lambda key, value: None
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000478else:
Skip Montanaro289bc052007-08-17 02:30:27 +0000479 __all__.append("putenv")
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000480
Skip Montanaro289bc052007-08-17 02:30:27 +0000481try:
482 _unsetenv = unsetenv
483except NameError:
484 _unsetenv = lambda key: _putenv(key, "")
485else:
486 __all__.append("unsetenv")
Guido van Rossumc524d952001-10-19 01:31:59 +0000487
Victor Stinner84ae1182010-05-06 22:05:07 +0000488def _createenviron():
489 if name in ('os2', 'nt'):
490 # Where Env Var Names Must Be UPPERCASE
491 def check_str(value):
492 if not isinstance(value, str):
493 raise TypeError("str expected, not %s" % type(value).__name__)
494 return value
495 encode = check_str
496 decode = str
497 def encodekey(key):
498 return encode(key).upper()
499 data = {}
500 for key, value in environ.items():
501 data[encodekey(key)] = value
502 else:
503 # Where Env Var Names Can Be Mixed Case
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000504 encoding = sys.getfilesystemencoding()
Victor Stinner84ae1182010-05-06 22:05:07 +0000505 def encode(value):
506 if not isinstance(value, str):
507 raise TypeError("str expected, not %s" % type(value).__name__)
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000508 return value.encode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000509 def decode(value):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000510 return value.decode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000511 encodekey = encode
512 data = environ
513 return _Environ(data,
514 encodekey, decode,
515 encode, decode,
516 _putenv, _unsetenv)
Guido van Rossumc524d952001-10-19 01:31:59 +0000517
Victor Stinner84ae1182010-05-06 22:05:07 +0000518# unicode environ
519environ = _createenviron()
520del _createenviron
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000521
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000522
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000523def getenv(key, default=None):
Tim Peters2c60f7a2003-01-29 03:49:43 +0000524 """Get an environment variable, return None if it doesn't exist.
Victor Stinner84ae1182010-05-06 22:05:07 +0000525 The optional second argument can specify an alternate default.
526 key, default and the result are str."""
Tim Peters2c60f7a2003-01-29 03:49:43 +0000527 return environ.get(key, default)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000528
Victor Stinnerb745a742010-05-18 17:17:23 +0000529supports_bytes_environ = name not in ('os2', 'nt')
530__all__.extend(("getenv", "supports_bytes_environ"))
531
532if supports_bytes_environ:
Victor Stinner84ae1182010-05-06 22:05:07 +0000533 def _check_bytes(value):
534 if not isinstance(value, bytes):
535 raise TypeError("bytes expected, not %s" % type(value).__name__)
536 return value
537
538 # bytes environ
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000539 environb = _Environ(environ._data,
Victor Stinner84ae1182010-05-06 22:05:07 +0000540 _check_bytes, bytes,
541 _check_bytes, bytes,
542 _putenv, _unsetenv)
543 del _check_bytes
544
545 def getenvb(key, default=None):
546 """Get an environment variable, return None if it doesn't exist.
547 The optional second argument can specify an alternate default.
548 key, default and the result are bytes."""
549 return environb.get(key, default)
Victor Stinner70120e22010-07-29 17:19:38 +0000550
551 __all__.extend(("environb", "getenvb"))
Victor Stinner84ae1182010-05-06 22:05:07 +0000552
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000553def _fscodec():
554 encoding = sys.getfilesystemencoding()
555 if encoding == 'mbcs':
Victor Stinnere882aac2010-10-24 21:12:26 +0000556 errors = 'strict'
Victor Stinner313a1202010-06-11 23:56:51 +0000557 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000558 errors = 'surrogateescape'
Victor Stinnere8d51452010-08-19 01:05:19 +0000559
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000560 def fsencode(filename):
561 """
562 Encode filename to the filesystem encoding with 'surrogateescape' error
563 handler, return bytes unchanged. On Windows, use 'strict' error handler if
564 the file system encoding is 'mbcs' (which is the default encoding).
565 """
566 if isinstance(filename, bytes):
567 return filename
568 elif isinstance(filename, str):
569 return filename.encode(encoding, errors)
Victor Stinnere8d51452010-08-19 01:05:19 +0000570 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000571 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
572
573 def fsdecode(filename):
574 """
575 Decode filename from the filesystem encoding with 'surrogateescape' error
576 handler, return str unchanged. On Windows, use 'strict' error handler if
577 the file system encoding is 'mbcs' (which is the default encoding).
578 """
579 if isinstance(filename, str):
580 return filename
581 elif isinstance(filename, bytes):
582 return filename.decode(encoding, errors)
583 else:
584 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
585
586 return fsencode, fsdecode
587
588fsencode, fsdecode = _fscodec()
589del _fscodec
Victor Stinner449c4662010-05-08 11:10:09 +0000590
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000591def _exists(name):
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000592 return name in globals()
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000593
594# Supply spawn*() (probably only for Unix)
595if _exists("fork") and not _exists("spawnv") and _exists("execv"):
596
597 P_WAIT = 0
598 P_NOWAIT = P_NOWAITO = 1
599
600 # XXX Should we support P_DETACH? I suppose it could fork()**2
601 # and close the std I/O streams. Also, P_OVERLAY is the same
602 # as execv*()?
603
604 def _spawnvef(mode, file, args, env, func):
605 # Internal helper; func is the exec*() function to use
606 pid = fork()
607 if not pid:
608 # Child
609 try:
610 if env is None:
611 func(file, args)
612 else:
613 func(file, args, env)
614 except:
615 _exit(127)
616 else:
617 # Parent
618 if mode == P_NOWAIT:
619 return pid # Caller is responsible for waiting!
620 while 1:
621 wpid, sts = waitpid(pid, 0)
622 if WIFSTOPPED(sts):
623 continue
624 elif WIFSIGNALED(sts):
625 return -WTERMSIG(sts)
626 elif WIFEXITED(sts):
627 return WEXITSTATUS(sts)
628 else:
Collin Winter828f04a2007-08-31 00:04:24 +0000629 raise error("Not stopped, signaled or exited???")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000630
631 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000632 """spawnv(mode, file, args) -> integer
633
634Execute file with arguments from args in a subprocess.
635If mode == P_NOWAIT return the pid of the process.
636If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000637otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000638 return _spawnvef(mode, file, args, None, execv)
639
640 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000641 """spawnve(mode, file, args, env) -> integer
642
643Execute file with arguments from args in a subprocess with the
644specified environment.
645If mode == P_NOWAIT return the pid of the process.
646If mode == P_WAIT return the process's exit code if it exits normally;
647otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000648 return _spawnvef(mode, file, args, env, execve)
649
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000650 # Note: spawnvp[e] is't currently supported on Windows
651
652 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000653 """spawnvp(mode, file, args) -> integer
654
655Execute file (which is looked for along $PATH) with arguments from
656args in a subprocess.
657If mode == P_NOWAIT return the pid of the process.
658If mode == P_WAIT return the process's exit code if it exits normally;
659otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000660 return _spawnvef(mode, file, args, None, execvp)
661
662 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000663 """spawnvpe(mode, file, args, env) -> integer
664
665Execute file (which is looked for along $PATH) with arguments from
666args in a subprocess with the supplied environment.
667If mode == P_NOWAIT return the pid of the process.
668If mode == P_WAIT return the process's exit code if it exits normally;
669otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000670 return _spawnvef(mode, file, args, env, execvpe)
671
672if _exists("spawnv"):
673 # These aren't supplied by the basic Windows code
674 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000675
676 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000677 """spawnl(mode, file, *args) -> integer
678
679Execute file with arguments from args in a subprocess.
680If mode == P_NOWAIT return the pid of the process.
681If mode == P_WAIT return the process's exit code if it exits normally;
682otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000683 return spawnv(mode, file, args)
684
685 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000686 """spawnle(mode, file, *args, env) -> integer
687
688Execute file with arguments from args in a subprocess with the
689supplied environment.
690If mode == P_NOWAIT return the pid of the process.
691If mode == P_WAIT return the process's exit code if it exits normally;
692otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000693 env = args[-1]
694 return spawnve(mode, file, args[:-1], env)
695
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000696
697 __all__.extend(["spawnv", "spawnve", "spawnl", "spawnle",])
698
699
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000700if _exists("spawnvp"):
701 # At the moment, Windows doesn't implement spawnvp[e],
702 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000703 def spawnlp(mode, file, *args):
Neal Norwitzb7f68102003-07-02 02:49:33 +0000704 """spawnlp(mode, file, *args) -> integer
Guido van Rossume0cd2912000-04-21 18:35:36 +0000705
706Execute file (which is looked for along $PATH) with arguments from
707args in a subprocess with the supplied environment.
708If mode == P_NOWAIT return the pid of the process.
709If mode == P_WAIT return the process's exit code if it exits normally;
710otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000711 return spawnvp(mode, file, args)
712
713 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000714 """spawnlpe(mode, file, *args, env) -> integer
715
716Execute file (which is looked for along $PATH) with arguments from
717args in a subprocess with the supplied environment.
718If mode == P_NOWAIT return the pid of the process.
719If mode == P_WAIT return the process's exit code if it exits normally;
720otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000721 env = args[-1]
722 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000723
724
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000725 __all__.extend(["spawnvp", "spawnvpe", "spawnlp", "spawnlpe",])
Skip Montanaro269b83b2001-02-06 01:07:02 +0000726
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000727import copyreg as _copyreg
Michael W. Hudson0e025302002-03-06 17:11:18 +0000728
729def _make_stat_result(tup, dict):
730 return stat_result(tup, dict)
731
732def _pickle_stat_result(sr):
733 (type, args) = sr.__reduce__()
734 return (_make_stat_result, args)
735
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000736try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000737 _copyreg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000738except NameError: # stat_result may not exist
739 pass
Michael W. Hudson0e025302002-03-06 17:11:18 +0000740
741def _make_statvfs_result(tup, dict):
742 return statvfs_result(tup, dict)
743
744def _pickle_statvfs_result(sr):
745 (type, args) = sr.__reduce__()
746 return (_make_statvfs_result, args)
747
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000748try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000749 _copyreg.pickle(statvfs_result, _pickle_statvfs_result,
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000750 _make_statvfs_result)
Michael W. Hudsone5363b72002-03-15 10:21:59 +0000751except NameError: # statvfs_result may not exist
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000752 pass
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000753
754if not _exists("urandom"):
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000755 def urandom(n):
756 """urandom(n) -> str
Tim Peters45e77c52004-08-29 18:47:31 +0000757
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000758 Return a string of n random bytes suitable for cryptographic use.
759
Tim Peters45e77c52004-08-29 18:47:31 +0000760 """
Georg Brandl9e43acf2005-07-04 17:16:07 +0000761 try:
762 _urandomfd = open("/dev/urandom", O_RDONLY)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000763 except (OSError, IOError):
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000764 raise NotImplementedError("/dev/urandom (or equivalent) not found")
Guido van Rossum572dbf82007-04-27 23:53:51 +0000765 bs = b""
766 while len(bs) < n:
767 bs += read(_urandomfd, n - len(bs))
Georg Brandl9e43acf2005-07-04 17:16:07 +0000768 close(_urandomfd)
Guido van Rossum572dbf82007-04-27 23:53:51 +0000769 return bs
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000770
771# Supply os.popen()
772def popen(cmd, mode="r", buffering=None):
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000773 if not isinstance(cmd, str):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000774 raise TypeError("invalid cmd type (%s, expected string)" % type(cmd))
775 if mode not in ("r", "w"):
776 raise ValueError("invalid mode %r" % mode)
777 import subprocess, io
778 if mode == "r":
779 proc = subprocess.Popen(cmd,
780 shell=True,
781 stdout=subprocess.PIPE,
782 bufsize=buffering)
783 return _wrap_close(io.TextIOWrapper(proc.stdout), proc)
784 else:
785 proc = subprocess.Popen(cmd,
786 shell=True,
787 stdin=subprocess.PIPE,
788 bufsize=buffering)
789 return _wrap_close(io.TextIOWrapper(proc.stdin), proc)
790
791# Helper for popen() -- a proxy for a file whose close waits for the process
792class _wrap_close:
793 def __init__(self, stream, proc):
794 self._stream = stream
795 self._proc = proc
796 def close(self):
797 self._stream.close()
Amaury Forgeot d'Arc97e5f282009-07-11 09:35:13 +0000798 returncode = self._proc.wait()
799 if returncode == 0:
800 return None
801 if name == 'nt':
802 return returncode
803 else:
804 return returncode << 8 # Shift left to match old behavior
Antoine Pitrouac625352009-12-09 00:01:27 +0000805 def __enter__(self):
806 return self
807 def __exit__(self, *args):
808 self.close()
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000809 def __getattr__(self, name):
810 return getattr(self._stream, name)
Thomas Heller476157b2007-09-04 11:27:47 +0000811 def __iter__(self):
812 return iter(self._stream)
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000813
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +0000814# Supply os.fdopen()
815def fdopen(fd, *args, **kwargs):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000816 if not isinstance(fd, int):
817 raise TypeError("invalid fd type (%s, expected integer)" % type(fd))
818 import io
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +0000819 return io.open(fd, *args, **kwargs)