blob: 28979bf8bd2caabe0f1fe800c24e774f543611e4 [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
Terry Reedy5a22b652010-12-02 07:05:56 +0000117
118def _get_masked_mode(mode):
119 mask = umask(0)
120 umask(mask)
121 return mode & ~mask
122
Skip Montanaro269b83b2001-02-06 01:07:02 +0000123#'
124
Guido van Rossum4def7de1998-07-24 20:48:03 +0000125# Super directory utilities.
126# (Inspired by Eric Raymond; the doc strings are mostly his)
127
Terry Reedy5a22b652010-12-02 07:05:56 +0000128def makedirs(name, mode=0o777, exist_ok=False):
129 """makedirs(path [, mode=0o777][, exist_ok=False])
Guido van Rossum4def7de1998-07-24 20:48:03 +0000130
131 Super-mkdir; create a leaf directory and all intermediate ones.
132 Works like mkdir, except that any intermediate path segment (not
Terry Reedy5a22b652010-12-02 07:05:56 +0000133 just the rightmost) will be created if it does not exist. If the
134 target directory with the same mode as we specified already exists,
135 raises an OSError if exist_ok is False, otherwise no exception is
136 raised. This is recursive.
Guido van Rossum4def7de1998-07-24 20:48:03 +0000137
138 """
139 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000140 if not tail:
141 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000142 if head and tail and not path.exists(head):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000143 try:
Terry Reedy5a22b652010-12-02 07:05:56 +0000144 makedirs(head, mode, exist_ok)
Guido van Rossumb940e112007-01-10 16:19:56 +0000145 except OSError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000146 # be happy if someone already created the path
Christian Heimes45f9af32007-11-27 21:50:00 +0000147 if e.errno != errno.EEXIST:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000148 raise
Andrew M. Kuchling6fccc8a2003-12-23 16:33:28 +0000149 if tail == curdir: # xxx/newdir/. exists if xxx/newdir exists
150 return
Terry Reedy5a22b652010-12-02 07:05:56 +0000151 try:
152 mkdir(name, mode)
153 except OSError as e:
154 import stat as st
155 if not (e.errno == errno.EEXIST and exist_ok and path.isdir(name) and
156 st.S_IMODE(lstat(name).st_mode) == _get_masked_mode(mode)):
157 raise
Guido van Rossum4def7de1998-07-24 20:48:03 +0000158
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
Guido van Rossumd8faa362007-04-27 19:54: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
Guido van Rossumd8faa362007-04-27 19:54: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
Christian Heimes5d8da202008-05-06 13:58:24 +0000256 import os
Tim Petersc4e09402003-04-25 07:11:48 +0000257 from os.path import join, getsize
Christian Heimes5d8da202008-05-06 13:58:24 +0000258 for root, dirs, files in os.walk('python/Lib/email'):
Neal Norwitz752abd02008-05-13 04:55:24 +0000259 print(root, "consumes", end="")
260 print(sum([getsize(join(root, name)) for name in files]), end="")
261 print("bytes in", len(files), "non-directory files")
Tim Petersc4e09402003-04-25 07:11:48 +0000262 if 'CVS' in dirs:
263 dirs.remove('CVS') # don't visit CVS directories
264 """
265
Benjamin Petersonf6489f92009-11-25 17:46:26 +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
Alexandre Vassalotti4e6531e2008-05-09 20:00:17 +0000269 # get a list of the files the directory contains. os.walk
Tim Petersc4e09402003-04-25 07:11:48 +0000270 # 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 Rossumb940e112007-01-10 16:19:56 +0000277 except error as err:
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000278 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 Petersonf6489f92009-11-25 17:46:26 +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):
Matthias Klosea09c54f2010-01-31 16:48:44 +0000339 """execvp(file, args)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000340
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:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000359 exec_func = execve
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000360 argrest = (args, env)
361 else:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000362 exec_func = execv
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000363 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:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000368 exec_func(file, *argrest)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000369 return
Guido van Rossume7ba4952007-06-06 23:52:48 +0000370 last_exc = saved_exc = None
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000371 saved_tb = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000372 path_list = get_exec_path(env)
373 if name != 'nt':
374 file = fsencode(file)
375 path_list = map(fsencode, path_list)
376 for dir in path_list:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000377 fullname = path.join(dir, file)
378 try:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000379 exec_func(fullname, *argrest)
Guido van Rossumb940e112007-01-10 16:19:56 +0000380 except error as e:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000381 last_exc = e
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000382 tb = sys.exc_info()[2]
Christian Heimes45f9af32007-11-27 21:50:00 +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:
Benjamin Peterson4b068192009-02-20 03:19:25 +0000388 raise saved_exc.with_traceback(saved_tb)
389 raise last_exc.with_traceback(tb)
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000390
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000391
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000392def get_exec_path(env=None):
393 """Returns the sequence of directories that will be searched for the
394 named executable (similar to a shell) when launching a process.
395
396 *env* must be an environment variable dict or None. If *env* is None,
397 os.environ will be used.
398 """
Victor Stinner273b7662010-11-06 12:59:33 +0000399 # Use a local import instead of a global import to limit the number of
400 # modules loaded at startup: the os module is always loaded at startup by
401 # Python. It may also avoid a bootstrap issue.
Victor Stinner6f35eda2010-10-29 00:38:58 +0000402 import warnings
403
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000404 if env is None:
405 env = environ
Victor Stinnerb745a742010-05-18 17:17:23 +0000406
Victor Stinnerbb4f2182010-11-07 15:43:39 +0000407 # {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a
408 # BytesWarning when using python -b or python -bb: ignore the warning
Victor Stinner273b7662010-11-06 12:59:33 +0000409 with warnings.catch_warnings():
410 warnings.simplefilter("ignore", BytesWarning)
Victor Stinnerb745a742010-05-18 17:17:23 +0000411
Victor Stinnerb745a742010-05-18 17:17:23 +0000412 try:
Victor Stinner273b7662010-11-06 12:59:33 +0000413 path_list = env.get('PATH')
414 except TypeError:
415 path_list = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000416
Victor Stinner273b7662010-11-06 12:59:33 +0000417 if supports_bytes_environ:
418 try:
419 path_listb = env[b'PATH']
420 except (KeyError, TypeError):
421 pass
422 else:
423 if path_list is not None:
424 raise ValueError(
425 "env cannot contain 'PATH' and b'PATH' keys")
426 path_list = path_listb
427
428 if path_list is not None and isinstance(path_list, bytes):
429 path_list = fsdecode(path_list)
Victor Stinnerb745a742010-05-18 17:17:23 +0000430
431 if path_list is None:
432 path_list = defpath
433 return path_list.split(pathsep)
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000434
435
Skip Montanaro289bc052007-08-17 02:30:27 +0000436# Change environ to automatically call putenv(), unsetenv if they exist.
Raymond Hettinger158c9c22011-02-22 00:41:50 +0000437from collections.abc import MutableMapping
Skip Montanaro289bc052007-08-17 02:30:27 +0000438
439class _Environ(MutableMapping):
Victor Stinner84ae1182010-05-06 22:05:07 +0000440 def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv):
441 self.encodekey = encodekey
442 self.decodekey = decodekey
443 self.encodevalue = encodevalue
444 self.decodevalue = decodevalue
Skip Montanaro289bc052007-08-17 02:30:27 +0000445 self.putenv = putenv
446 self.unsetenv = unsetenv
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000447 self._data = data
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000448
Skip Montanaro289bc052007-08-17 02:30:27 +0000449 def __getitem__(self, key):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000450 value = self._data[self.encodekey(key)]
Victor Stinner84ae1182010-05-06 22:05:07 +0000451 return self.decodevalue(value)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000452
Skip Montanaro289bc052007-08-17 02:30:27 +0000453 def __setitem__(self, key, value):
Victor Stinner84ae1182010-05-06 22:05:07 +0000454 key = self.encodekey(key)
455 value = self.encodevalue(value)
Skip Montanaro289bc052007-08-17 02:30:27 +0000456 self.putenv(key, value)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000457 self._data[key] = value
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000458
Skip Montanaro289bc052007-08-17 02:30:27 +0000459 def __delitem__(self, key):
Victor Stinner84ae1182010-05-06 22:05:07 +0000460 key = self.encodekey(key)
Skip Montanaro289bc052007-08-17 02:30:27 +0000461 self.unsetenv(key)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000462 del self._data[key]
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000463
Skip Montanaro289bc052007-08-17 02:30:27 +0000464 def __iter__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000465 for key in self._data:
Victor Stinner84ae1182010-05-06 22:05:07 +0000466 yield self.decodekey(key)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000467
Skip Montanaro289bc052007-08-17 02:30:27 +0000468 def __len__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000469 return len(self._data)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000470
471 def __repr__(self):
Victor Stinnerbed71172010-07-28 21:25:42 +0000472 return 'environ({{{}}})'.format(', '.join(
Victor Stinnerd73c1a32010-07-28 21:23:23 +0000473 ('{!r}: {!r}'.format(self.decodekey(key), self.decodevalue(value))
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000474 for key, value in self._data.items())))
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000475
Skip Montanaro289bc052007-08-17 02:30:27 +0000476 def copy(self):
477 return dict(self)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000478
Skip Montanaro289bc052007-08-17 02:30:27 +0000479 def setdefault(self, key, value):
480 if key not in self:
481 self[key] = value
482 return self[key]
483
484try:
485 _putenv = putenv
486except NameError:
487 _putenv = lambda key, value: None
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000488else:
Skip Montanaro289bc052007-08-17 02:30:27 +0000489 __all__.append("putenv")
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000490
Skip Montanaro289bc052007-08-17 02:30:27 +0000491try:
492 _unsetenv = unsetenv
493except NameError:
494 _unsetenv = lambda key: _putenv(key, "")
495else:
496 __all__.append("unsetenv")
Guido van Rossumc524d952001-10-19 01:31:59 +0000497
Victor Stinner84ae1182010-05-06 22:05:07 +0000498def _createenviron():
499 if name in ('os2', 'nt'):
500 # Where Env Var Names Must Be UPPERCASE
501 def check_str(value):
502 if not isinstance(value, str):
503 raise TypeError("str expected, not %s" % type(value).__name__)
504 return value
505 encode = check_str
506 decode = str
507 def encodekey(key):
508 return encode(key).upper()
509 data = {}
510 for key, value in environ.items():
511 data[encodekey(key)] = value
512 else:
513 # Where Env Var Names Can Be Mixed Case
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000514 encoding = sys.getfilesystemencoding()
Victor Stinner84ae1182010-05-06 22:05:07 +0000515 def encode(value):
516 if not isinstance(value, str):
517 raise TypeError("str expected, not %s" % type(value).__name__)
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000518 return value.encode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000519 def decode(value):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000520 return value.decode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000521 encodekey = encode
522 data = environ
523 return _Environ(data,
524 encodekey, decode,
525 encode, decode,
526 _putenv, _unsetenv)
Guido van Rossumc524d952001-10-19 01:31:59 +0000527
Victor Stinner84ae1182010-05-06 22:05:07 +0000528# unicode environ
529environ = _createenviron()
530del _createenviron
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000531
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000532
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000533def getenv(key, default=None):
Tim Peters2c60f7a2003-01-29 03:49:43 +0000534 """Get an environment variable, return None if it doesn't exist.
Victor Stinner84ae1182010-05-06 22:05:07 +0000535 The optional second argument can specify an alternate default.
536 key, default and the result are str."""
Tim Peters2c60f7a2003-01-29 03:49:43 +0000537 return environ.get(key, default)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000538
Victor Stinnerb745a742010-05-18 17:17:23 +0000539supports_bytes_environ = name not in ('os2', 'nt')
540__all__.extend(("getenv", "supports_bytes_environ"))
541
542if supports_bytes_environ:
Victor Stinner84ae1182010-05-06 22:05:07 +0000543 def _check_bytes(value):
544 if not isinstance(value, bytes):
545 raise TypeError("bytes expected, not %s" % type(value).__name__)
546 return value
547
548 # bytes environ
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000549 environb = _Environ(environ._data,
Victor Stinner84ae1182010-05-06 22:05:07 +0000550 _check_bytes, bytes,
551 _check_bytes, bytes,
552 _putenv, _unsetenv)
553 del _check_bytes
554
555 def getenvb(key, default=None):
556 """Get an environment variable, return None if it doesn't exist.
557 The optional second argument can specify an alternate default.
558 key, default and the result are bytes."""
559 return environb.get(key, default)
Victor Stinner70120e22010-07-29 17:19:38 +0000560
561 __all__.extend(("environb", "getenvb"))
Victor Stinner84ae1182010-05-06 22:05:07 +0000562
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000563def _fscodec():
564 encoding = sys.getfilesystemencoding()
565 if encoding == 'mbcs':
Victor Stinnere882aac2010-10-24 21:12:26 +0000566 errors = 'strict'
Victor Stinner313a1202010-06-11 23:56:51 +0000567 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000568 errors = 'surrogateescape'
Victor Stinnere8d51452010-08-19 01:05:19 +0000569
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000570 def fsencode(filename):
571 """
572 Encode filename to the filesystem encoding with 'surrogateescape' error
573 handler, return bytes unchanged. On Windows, use 'strict' error handler if
574 the file system encoding is 'mbcs' (which is the default encoding).
575 """
576 if isinstance(filename, bytes):
577 return filename
578 elif isinstance(filename, str):
579 return filename.encode(encoding, errors)
Victor Stinnere8d51452010-08-19 01:05:19 +0000580 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000581 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
582
583 def fsdecode(filename):
584 """
585 Decode filename from the filesystem encoding with 'surrogateescape' error
586 handler, return str unchanged. On Windows, use 'strict' error handler if
587 the file system encoding is 'mbcs' (which is the default encoding).
588 """
589 if isinstance(filename, str):
590 return filename
591 elif isinstance(filename, bytes):
592 return filename.decode(encoding, errors)
593 else:
594 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
595
596 return fsencode, fsdecode
597
598fsencode, fsdecode = _fscodec()
599del _fscodec
Victor Stinner449c4662010-05-08 11:10:09 +0000600
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000601def _exists(name):
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000602 return name in globals()
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000603
604# Supply spawn*() (probably only for Unix)
605if _exists("fork") and not _exists("spawnv") and _exists("execv"):
606
607 P_WAIT = 0
608 P_NOWAIT = P_NOWAITO = 1
609
610 # XXX Should we support P_DETACH? I suppose it could fork()**2
611 # and close the std I/O streams. Also, P_OVERLAY is the same
612 # as execv*()?
613
614 def _spawnvef(mode, file, args, env, func):
615 # Internal helper; func is the exec*() function to use
616 pid = fork()
617 if not pid:
618 # Child
619 try:
620 if env is None:
621 func(file, args)
622 else:
623 func(file, args, env)
624 except:
625 _exit(127)
626 else:
627 # Parent
628 if mode == P_NOWAIT:
629 return pid # Caller is responsible for waiting!
630 while 1:
631 wpid, sts = waitpid(pid, 0)
632 if WIFSTOPPED(sts):
633 continue
634 elif WIFSIGNALED(sts):
635 return -WTERMSIG(sts)
636 elif WIFEXITED(sts):
637 return WEXITSTATUS(sts)
638 else:
Collin Winter828f04a2007-08-31 00:04:24 +0000639 raise error("Not stopped, signaled or exited???")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000640
641 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000642 """spawnv(mode, file, args) -> integer
643
644Execute file with arguments from args in a subprocess.
645If mode == P_NOWAIT return the pid of the process.
646If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000647otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000648 return _spawnvef(mode, file, args, None, execv)
649
650 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000651 """spawnve(mode, file, args, env) -> integer
652
653Execute file with arguments from args in a subprocess with the
654specified environment.
655If mode == P_NOWAIT return the pid of the process.
656If mode == P_WAIT return the process's exit code if it exits normally;
657otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000658 return _spawnvef(mode, file, args, env, execve)
659
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000660 # Note: spawnvp[e] is't currently supported on Windows
661
662 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000663 """spawnvp(mode, file, args) -> integer
664
665Execute file (which is looked for along $PATH) with arguments from
666args in a subprocess.
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, None, execvp)
671
672 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000673 """spawnvpe(mode, file, args, env) -> integer
674
675Execute file (which is looked for along $PATH) with arguments from
676args in a subprocess with the supplied environment.
677If mode == P_NOWAIT return the pid of the process.
678If mode == P_WAIT return the process's exit code if it exits normally;
679otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000680 return _spawnvef(mode, file, args, env, execvpe)
681
682if _exists("spawnv"):
683 # These aren't supplied by the basic Windows code
684 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000685
686 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000687 """spawnl(mode, file, *args) -> integer
688
689Execute file with arguments from args in a subprocess.
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 return spawnv(mode, file, args)
694
695 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000696 """spawnle(mode, file, *args, env) -> integer
697
698Execute file with arguments from args in a subprocess with the
699supplied environment.
700If mode == P_NOWAIT return the pid of the process.
701If mode == P_WAIT return the process's exit code if it exits normally;
702otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000703 env = args[-1]
704 return spawnve(mode, file, args[:-1], env)
705
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000706
707 __all__.extend(["spawnv", "spawnve", "spawnl", "spawnle",])
708
709
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000710if _exists("spawnvp"):
711 # At the moment, Windows doesn't implement spawnvp[e],
712 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000713 def spawnlp(mode, file, *args):
Neal Norwitzb7f68102003-07-02 02:49:33 +0000714 """spawnlp(mode, file, *args) -> integer
Guido van Rossume0cd2912000-04-21 18:35:36 +0000715
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 return spawnvp(mode, file, args)
722
723 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000724 """spawnlpe(mode, file, *args, env) -> integer
725
726Execute file (which is looked for along $PATH) with arguments from
727args in a subprocess with the supplied environment.
728If mode == P_NOWAIT return the pid of the process.
729If mode == P_WAIT return the process's exit code if it exits normally;
730otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000731 env = args[-1]
732 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000733
734
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000735 __all__.extend(["spawnvp", "spawnvpe", "spawnlp", "spawnlpe",])
Skip Montanaro269b83b2001-02-06 01:07:02 +0000736
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000737import copyreg as _copyreg
Michael W. Hudson0e025302002-03-06 17:11:18 +0000738
739def _make_stat_result(tup, dict):
740 return stat_result(tup, dict)
741
742def _pickle_stat_result(sr):
743 (type, args) = sr.__reduce__()
744 return (_make_stat_result, args)
745
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000746try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000747 _copyreg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000748except NameError: # stat_result may not exist
749 pass
Michael W. Hudson0e025302002-03-06 17:11:18 +0000750
751def _make_statvfs_result(tup, dict):
752 return statvfs_result(tup, dict)
753
754def _pickle_statvfs_result(sr):
755 (type, args) = sr.__reduce__()
756 return (_make_statvfs_result, args)
757
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000758try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000759 _copyreg.pickle(statvfs_result, _pickle_statvfs_result,
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000760 _make_statvfs_result)
Michael W. Hudsone5363b72002-03-15 10:21:59 +0000761except NameError: # statvfs_result may not exist
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000762 pass
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000763
764if not _exists("urandom"):
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000765 def urandom(n):
766 """urandom(n) -> str
Tim Peters45e77c52004-08-29 18:47:31 +0000767
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000768 Return a string of n random bytes suitable for cryptographic use.
769
Tim Peters45e77c52004-08-29 18:47:31 +0000770 """
Georg Brandl9e43acf2005-07-04 17:16:07 +0000771 try:
772 _urandomfd = open("/dev/urandom", O_RDONLY)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000773 except (OSError, IOError):
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000774 raise NotImplementedError("/dev/urandom (or equivalent) not found")
Guido van Rossum572dbf82007-04-27 23:53:51 +0000775 bs = b""
776 while len(bs) < n:
777 bs += read(_urandomfd, n - len(bs))
Georg Brandl9e43acf2005-07-04 17:16:07 +0000778 close(_urandomfd)
Guido van Rossum572dbf82007-04-27 23:53:51 +0000779 return bs
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000780
781# Supply os.popen()
Antoine Pitrou877766d2011-03-19 17:00:37 +0100782def popen(cmd, mode="r", buffering=-1):
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000783 if not isinstance(cmd, str):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000784 raise TypeError("invalid cmd type (%s, expected string)" % type(cmd))
785 if mode not in ("r", "w"):
786 raise ValueError("invalid mode %r" % mode)
Antoine Pitrou877766d2011-03-19 17:00:37 +0100787 if buffering == 0 or buffering == None:
788 raise ValueError("popen() does not support unbuffered streams")
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000789 import subprocess, io
790 if mode == "r":
791 proc = subprocess.Popen(cmd,
792 shell=True,
793 stdout=subprocess.PIPE,
794 bufsize=buffering)
795 return _wrap_close(io.TextIOWrapper(proc.stdout), proc)
796 else:
797 proc = subprocess.Popen(cmd,
798 shell=True,
799 stdin=subprocess.PIPE,
800 bufsize=buffering)
801 return _wrap_close(io.TextIOWrapper(proc.stdin), proc)
802
803# Helper for popen() -- a proxy for a file whose close waits for the process
804class _wrap_close:
805 def __init__(self, stream, proc):
806 self._stream = stream
807 self._proc = proc
808 def close(self):
809 self._stream.close()
Amaury Forgeot d'Arc97e5f282009-07-11 09:35:13 +0000810 returncode = self._proc.wait()
811 if returncode == 0:
812 return None
813 if name == 'nt':
814 return returncode
815 else:
816 return returncode << 8 # Shift left to match old behavior
Antoine Pitrouac625352009-12-09 00:01:27 +0000817 def __enter__(self):
818 return self
819 def __exit__(self, *args):
820 self.close()
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000821 def __getattr__(self, name):
822 return getattr(self._stream, name)
Thomas Heller476157b2007-09-04 11:27:47 +0000823 def __iter__(self):
824 return iter(self._stream)
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000825
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +0000826# Supply os.fdopen()
827def fdopen(fd, *args, **kwargs):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000828 if not isinstance(fd, int):
829 raise TypeError("invalid fd type (%s, expected integer)" % type(fd))
830 import io
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +0000831 return io.open(fd, *args, **kwargs)