blob: e7d089ed35b32325a0ced57e90242408e78b4a4b [file] [log] [blame]
Ned Deily5c867012014-06-26 23:40:06 -07001r"""OS routines for 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:
Jesus Cea4791a242012-10-05 03:15:39 +02004 - all functions from posix, nt or ce, e.g. unlink, stat, etc.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +00005 - os.path is either posixpath or ntpath
Jesus Cea4791a242012-10-05 03:15:39 +02006 - os.name is either 'posix', 'nt' 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#'
Ethan Furman958b3e42016-06-04 12:49:35 -070025import abc
Christian Heimes45f9af32007-11-27 21:50:00 +000026import sys, errno
Charles-François Natali7372b062012-02-05 15:15:38 +010027import stat as st
Guido van Rossuma28dab51997-08-29 22:36:47 +000028
29_names = sys.builtin_module_names
30
Tim Petersc4e09402003-04-25 07:11:48 +000031# Note: more names are added to __all__ later.
Brett Cannon13962fc2008-08-18 01:45:29 +000032__all__ = ["altsep", "curdir", "pardir", "sep", "pathsep", "linesep",
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030033 "defpath", "name", "path", "devnull", "SEEK_SET", "SEEK_CUR",
34 "SEEK_END", "fsencode", "fsdecode", "get_exec_path", "fdopen",
35 "popen", "extsep"]
Skip Montanaro269b83b2001-02-06 01:07:02 +000036
Charles-François Natali7372b062012-02-05 15:15:38 +010037def _exists(name):
38 return name in globals()
39
Skip Montanaro269b83b2001-02-06 01:07:02 +000040def _get_exports_list(module):
41 try:
42 return list(module.__all__)
43 except AttributeError:
44 return [n for n in dir(module) if n[0] != '_']
45
Brett Cannonfd074152012-04-14 14:10:13 -040046# Any new dependencies of the os module and/or changes in path separator
47# requires updating importlib as well.
Guido van Rossuma28dab51997-08-29 22:36:47 +000048if 'posix' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000049 name = 'posix'
Guido van Rossume9387ea1998-05-22 15:26:04 +000050 linesep = '\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000051 from posix import *
52 try:
53 from posix import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030054 __all__.append('_exit')
Brett Cannoncd171c82013-07-04 17:43:24 -040055 except ImportError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000056 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000057 import posixpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000058
Larry Hastings9cf065c2012-06-22 16:30:09 -070059 try:
60 from posix import _have_functions
Brett Cannoncd171c82013-07-04 17:43:24 -040061 except ImportError:
Larry Hastings9cf065c2012-06-22 16:30:09 -070062 pass
Skip Montanaro269b83b2001-02-06 01:07:02 +000063
Yury Selivanov97e2e062014-09-26 12:33:06 -040064 import posix
65 __all__.extend(_get_exports_list(posix))
66 del posix
67
Guido van Rossuma28dab51997-08-29 22:36:47 +000068elif 'nt' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000069 name = 'nt'
Guido van Rossume9387ea1998-05-22 15:26:04 +000070 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000071 from nt import *
Tim Peters6757c1e2003-01-08 21:20:57 +000072 try:
73 from nt import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030074 __all__.append('_exit')
Brett Cannoncd171c82013-07-04 17:43:24 -040075 except ImportError:
Tim Peters6757c1e2003-01-08 21:20:57 +000076 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000077 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000078
Skip Montanaro269b83b2001-02-06 01:07:02 +000079 import nt
80 __all__.extend(_get_exports_list(nt))
81 del nt
82
Larry Hastings9cf065c2012-06-22 16:30:09 -070083 try:
84 from nt import _have_functions
Brett Cannoncd171c82013-07-04 17:43:24 -040085 except ImportError:
Larry Hastings9cf065c2012-06-22 16:30:09 -070086 pass
87
Guido van Rossum18df5d41999-06-11 01:37:27 +000088elif 'ce' in _names:
89 name = 'ce'
90 linesep = '\r\n'
Guido van Rossum18df5d41999-06-11 01:37:27 +000091 from ce import *
Tim Peters6757c1e2003-01-08 21:20:57 +000092 try:
93 from ce import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030094 __all__.append('_exit')
Brett Cannoncd171c82013-07-04 17:43:24 -040095 except ImportError:
Tim Peters6757c1e2003-01-08 21:20:57 +000096 pass
Guido van Rossum18df5d41999-06-11 01:37:27 +000097 # We can use the standard Windows path.
Skip Montanaro117910d2003-02-14 19:35:31 +000098 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000099
Skip Montanaro269b83b2001-02-06 01:07:02 +0000100 import ce
101 __all__.extend(_get_exports_list(ce))
102 del ce
103
Larry Hastings9cf065c2012-06-22 16:30:09 -0700104 try:
105 from ce import _have_functions
Brett Cannoncd171c82013-07-04 17:43:24 -0400106 except ImportError:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700107 pass
108
Guido van Rossum2979b011994-08-01 11:18:30 +0000109else:
Brett Cannoncd171c82013-07-04 17:43:24 -0400110 raise ImportError('no os specific module found')
Guido van Rossume65cce51993-11-08 15:05:21 +0000111
Skip Montanaro117910d2003-02-14 19:35:31 +0000112sys.modules['os.path'] = path
Georg Brandled5b9b32008-12-05 07:45:54 +0000113from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep,
114 devnull)
Skip Montanaro269b83b2001-02-06 01:07:02 +0000115
Guido van Rossuma28dab51997-08-29 22:36:47 +0000116del _names
117
Larry Hastings9cf065c2012-06-22 16:30:09 -0700118
119if _exists("_have_functions"):
120 _globals = globals()
121 def _add(str, fn):
122 if (fn in _globals) and (str in _have_functions):
123 _set.add(_globals[fn])
124
125 _set = set()
126 _add("HAVE_FACCESSAT", "access")
127 _add("HAVE_FCHMODAT", "chmod")
128 _add("HAVE_FCHOWNAT", "chown")
129 _add("HAVE_FSTATAT", "stat")
130 _add("HAVE_FUTIMESAT", "utime")
131 _add("HAVE_LINKAT", "link")
132 _add("HAVE_MKDIRAT", "mkdir")
133 _add("HAVE_MKFIFOAT", "mkfifo")
134 _add("HAVE_MKNODAT", "mknod")
135 _add("HAVE_OPENAT", "open")
136 _add("HAVE_READLINKAT", "readlink")
137 _add("HAVE_RENAMEAT", "rename")
138 _add("HAVE_SYMLINKAT", "symlink")
139 _add("HAVE_UNLINKAT", "unlink")
Larry Hastingsb698d8e2012-06-23 16:55:07 -0700140 _add("HAVE_UNLINKAT", "rmdir")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700141 _add("HAVE_UTIMENSAT", "utime")
142 supports_dir_fd = _set
143
144 _set = set()
145 _add("HAVE_FACCESSAT", "access")
146 supports_effective_ids = _set
147
148 _set = set()
149 _add("HAVE_FCHDIR", "chdir")
150 _add("HAVE_FCHMOD", "chmod")
151 _add("HAVE_FCHOWN", "chown")
152 _add("HAVE_FDOPENDIR", "listdir")
153 _add("HAVE_FEXECVE", "execve")
154 _set.add(stat) # fstat always works
Georg Brandl306336b2012-06-24 12:55:33 +0200155 _add("HAVE_FTRUNCATE", "truncate")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700156 _add("HAVE_FUTIMENS", "utime")
157 _add("HAVE_FUTIMES", "utime")
Georg Brandl306336b2012-06-24 12:55:33 +0200158 _add("HAVE_FPATHCONF", "pathconf")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700159 if _exists("statvfs") and _exists("fstatvfs"): # mac os x10.3
160 _add("HAVE_FSTATVFS", "statvfs")
161 supports_fd = _set
162
163 _set = set()
164 _add("HAVE_FACCESSAT", "access")
Larry Hastingsdbbc0c82012-06-22 19:50:21 -0700165 # Some platforms don't support lchmod(). Often the function exists
166 # anyway, as a stub that always returns ENOSUP or perhaps EOPNOTSUPP.
167 # (No, I don't know why that's a good design.) ./configure will detect
168 # this and reject it--so HAVE_LCHMOD still won't be defined on such
169 # platforms. This is Very Helpful.
170 #
171 # However, sometimes platforms without a working lchmod() *do* have
172 # fchmodat(). (Examples: Linux kernel 3.2 with glibc 2.15,
173 # OpenIndiana 3.x.) And fchmodat() has a flag that theoretically makes
174 # it behave like lchmod(). So in theory it would be a suitable
175 # replacement for lchmod(). But when lchmod() doesn't work, fchmodat()'s
176 # flag doesn't work *either*. Sadly ./configure isn't sophisticated
177 # enough to detect this condition--it only determines whether or not
178 # fchmodat() minimally works.
179 #
180 # Therefore we simply ignore fchmodat() when deciding whether or not
181 # os.chmod supports follow_symlinks. Just checking lchmod() is
182 # sufficient. After all--if you have a working fchmodat(), your
183 # lchmod() almost certainly works too.
184 #
185 # _add("HAVE_FCHMODAT", "chmod")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700186 _add("HAVE_FCHOWNAT", "chown")
187 _add("HAVE_FSTATAT", "stat")
188 _add("HAVE_LCHFLAGS", "chflags")
189 _add("HAVE_LCHMOD", "chmod")
190 if _exists("lchown"): # mac os x10.3
191 _add("HAVE_LCHOWN", "chown")
192 _add("HAVE_LINKAT", "link")
193 _add("HAVE_LUTIMES", "utime")
194 _add("HAVE_LSTAT", "stat")
195 _add("HAVE_FSTATAT", "stat")
196 _add("HAVE_UTIMENSAT", "utime")
197 _add("MS_WINDOWS", "stat")
198 supports_follow_symlinks = _set
199
Larry Hastings9cf065c2012-06-22 16:30:09 -0700200 del _set
201 del _have_functions
202 del _globals
203 del _add
204
205
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000206# Python uses fixed values for the SEEK_ constants; they are mapped
207# to native constants if necessary in posixmodule.c
Jesus Cea94363612012-06-22 18:32:07 +0200208# Other possible SEEK values are directly imported from posixmodule.c
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000209SEEK_SET = 0
210SEEK_CUR = 1
211SEEK_END = 2
212
Guido van Rossum4def7de1998-07-24 20:48:03 +0000213# Super directory utilities.
214# (Inspired by Eric Raymond; the doc strings are mostly his)
215
Terry Reedy5a22b652010-12-02 07:05:56 +0000216def makedirs(name, mode=0o777, exist_ok=False):
Zachary Warea22ae212014-03-20 09:42:01 -0500217 """makedirs(name [, mode=0o777][, exist_ok=False])
Guido van Rossum4def7de1998-07-24 20:48:03 +0000218
Benjamin Petersonee5f1c12014-04-01 19:13:18 -0400219 Super-mkdir; create a leaf directory and all intermediate ones. Works like
220 mkdir, except that any intermediate path segment (not just the rightmost)
221 will be created if it does not exist. If the target directory already
222 exists, raise an OSError if exist_ok is False. Otherwise no exception is
Terry Reedy5a22b652010-12-02 07:05:56 +0000223 raised. This is recursive.
Guido van Rossum4def7de1998-07-24 20:48:03 +0000224
225 """
226 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000227 if not tail:
228 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000229 if head and tail and not path.exists(head):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000230 try:
Terry Reedy5a22b652010-12-02 07:05:56 +0000231 makedirs(head, mode, exist_ok)
Giampaolo Rodola'0166a282013-02-12 15:14:17 +0100232 except FileExistsError:
Martin Pantera82642f2015-11-19 04:48:44 +0000233 # Defeats race condition when another thread created the path
Giampaolo Rodola'0166a282013-02-12 15:14:17 +0100234 pass
Serhiy Storchaka4ab23bf2013-01-08 11:32:58 +0200235 cdir = curdir
236 if isinstance(tail, bytes):
237 cdir = bytes(curdir, 'ASCII')
238 if tail == cdir: # xxx/newdir/. exists if xxx/newdir exists
Andrew M. Kuchling6fccc8a2003-12-23 16:33:28 +0000239 return
Terry Reedy5a22b652010-12-02 07:05:56 +0000240 try:
241 mkdir(name, mode)
Martin Pantera82642f2015-11-19 04:48:44 +0000242 except OSError:
243 # Cannot rely on checking for EEXIST, since the operating system
244 # could give priority to other errors like EACCES or EROFS
245 if not exist_ok or not path.isdir(name):
Terry Reedy5a22b652010-12-02 07:05:56 +0000246 raise
Guido van Rossum4def7de1998-07-24 20:48:03 +0000247
248def removedirs(name):
Zachary Warea22ae212014-03-20 09:42:01 -0500249 """removedirs(name)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000250
Fredrik Lundh96c1c7a2005-11-12 15:55:04 +0000251 Super-rmdir; remove a leaf directory and all empty intermediate
Guido van Rossum4def7de1998-07-24 20:48:03 +0000252 ones. Works like rmdir except that, if the leaf directory is
253 successfully removed, directories corresponding to rightmost path
Tim Petersc4e09402003-04-25 07:11:48 +0000254 segments will be pruned away until either the whole path is
Guido van Rossum4def7de1998-07-24 20:48:03 +0000255 consumed or an error occurs. Errors during this latter phase are
256 ignored -- they generally mean that a directory was not empty.
257
258 """
259 rmdir(name)
260 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000261 if not tail:
262 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000263 while head and tail:
264 try:
265 rmdir(head)
Andrew Svetlov2552bc02012-12-24 21:47:24 +0200266 except OSError:
Guido van Rossum4def7de1998-07-24 20:48:03 +0000267 break
268 head, tail = path.split(head)
269
270def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000271 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000272
273 Super-rename; create directories as necessary and delete any left
274 empty. Works like rename, except creation of any intermediate
275 directories needed to make the new pathname good is attempted
276 first. After the rename, directories corresponding to rightmost
Benjamin Peterson52a3b742015-04-13 20:24:10 -0400277 path segments of the old name will be pruned until either the
Guido van Rossum4def7de1998-07-24 20:48:03 +0000278 whole path is consumed or a nonempty directory is found.
279
280 Note: this function can fail with the new directory structure made
281 if you lack permissions needed to unlink the leaf directory or
282 file.
283
284 """
285 head, tail = path.split(new)
286 if head and tail and not path.exists(head):
287 makedirs(head)
288 rename(old, new)
289 head, tail = path.split(old)
290 if head and tail:
291 try:
292 removedirs(head)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200293 except OSError:
Guido van Rossum4def7de1998-07-24 20:48:03 +0000294 pass
295
Skip Montanaro269b83b2001-02-06 01:07:02 +0000296__all__.extend(["makedirs", "removedirs", "renames"])
297
Guido van Rossumd8faa362007-04-27 19:54:29 +0000298def walk(top, topdown=True, onerror=None, followlinks=False):
Tim Petersc4e09402003-04-25 07:11:48 +0000299 """Directory tree generator.
300
301 For each directory in the directory tree rooted at top (including top
302 itself, but excluding '.' and '..'), yields a 3-tuple
303
304 dirpath, dirnames, filenames
305
306 dirpath is a string, the path to the directory. dirnames is a list of
307 the names of the subdirectories in dirpath (excluding '.' and '..').
308 filenames is a list of the names of the non-directory files in dirpath.
309 Note that the names in the lists are just names, with no path components.
310 To get a full path (which begins with top) to a file or directory in
311 dirpath, do os.path.join(dirpath, name).
312
313 If optional arg 'topdown' is true or not specified, the triple for a
314 directory is generated before the triples for any of its subdirectories
315 (directories are generated top down). If topdown is false, the triple
316 for a directory is generated after the triples for all of its
317 subdirectories (directories are generated bottom up).
318
319 When topdown is true, the caller can modify the dirnames list in-place
320 (e.g., via del or slice assignment), and walk will only recurse into the
Benjamin Petersone58e0c72014-06-15 20:51:12 -0700321 subdirectories whose names remain in dirnames; this can be used to prune the
322 search, or to impose a specific order of visiting. Modifying dirnames when
323 topdown is false is ineffective, since the directories in dirnames have
324 already been generated by the time dirnames itself is generated. No matter
325 the value of topdown, the list of subdirectories is retrieved before the
326 tuples for the directory and its subdirectories are generated.
Tim Petersc4e09402003-04-25 07:11:48 +0000327
Victor Stinner524a5ba2015-03-10 13:20:34 +0100328 By default errors from the os.scandir() call are ignored. If
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000329 optional arg 'onerror' is specified, it should be a function; it
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200330 will be called with one argument, an OSError instance. It can
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000331 report the error to continue with the walk, or raise the exception
332 to abort the walk. Note that the filename is available as the
333 filename attribute of the exception object.
334
Guido van Rossumd8faa362007-04-27 19:54:29 +0000335 By default, os.walk does not follow symbolic links to subdirectories on
336 systems that support them. In order to get this functionality, set the
337 optional argument 'followlinks' to true.
338
Tim Petersc4e09402003-04-25 07:11:48 +0000339 Caution: if you pass a relative pathname for top, don't change the
340 current working directory between resumptions of walk. walk never
341 changes the current directory, and assumes that the client doesn't
342 either.
343
344 Example:
345
Christian Heimes5d8da202008-05-06 13:58:24 +0000346 import os
Tim Petersc4e09402003-04-25 07:11:48 +0000347 from os.path import join, getsize
Christian Heimes5d8da202008-05-06 13:58:24 +0000348 for root, dirs, files in os.walk('python/Lib/email'):
Neal Norwitz752abd02008-05-13 04:55:24 +0000349 print(root, "consumes", end="")
350 print(sum([getsize(join(root, name)) for name in files]), end="")
351 print("bytes in", len(files), "non-directory files")
Tim Petersc4e09402003-04-25 07:11:48 +0000352 if 'CVS' in dirs:
353 dirs.remove('CVS') # don't visit CVS directories
Benjamin Petersone58e0c72014-06-15 20:51:12 -0700354
Tim Petersc4e09402003-04-25 07:11:48 +0000355 """
356
Victor Stinner524a5ba2015-03-10 13:20:34 +0100357 dirs = []
358 nondirs = []
Serhiy Storchaka7c90a822016-02-11 13:31:00 +0200359 walk_dirs = []
Tim Petersc4e09402003-04-25 07:11:48 +0000360
361 # We may not have read permission for top, in which case we can't
Alexandre Vassalotti4e6531e2008-05-09 20:00:17 +0000362 # get a list of the files the directory contains. os.walk
Tim Petersc4e09402003-04-25 07:11:48 +0000363 # always suppressed the exception then, rather than blow up for a
364 # minor reason when (say) a thousand readable directories are still
365 # left to visit. That logic is copied here.
366 try:
Serhiy Storchaka5f6a0b42016-02-08 16:23:28 +0200367 if name == 'nt' and isinstance(top, bytes):
368 scandir_it = _dummy_scandir(top)
369 else:
370 # Note that scandir is global in this module due
371 # to earlier import-*.
372 scandir_it = scandir(top)
Victor Stinner7fea9742015-03-18 11:29:47 +0100373 except OSError as error:
374 if onerror is not None:
375 onerror(error)
376 return
377
Serhiy Storchakaffe96ae2016-02-11 13:21:30 +0200378 with scandir_it:
379 while True:
Victor Stinner524a5ba2015-03-10 13:20:34 +0100380 try:
Victor Stinner524a5ba2015-03-10 13:20:34 +0100381 try:
Serhiy Storchakaffe96ae2016-02-11 13:21:30 +0200382 entry = next(scandir_it)
383 except StopIteration:
384 break
385 except OSError as error:
386 if onerror is not None:
387 onerror(error)
388 return
Victor Stinner7fea9742015-03-18 11:29:47 +0100389
Serhiy Storchakaffe96ae2016-02-11 13:21:30 +0200390 try:
391 is_dir = entry.is_dir()
392 except OSError:
393 # If is_dir() raises an OSError, consider that the entry is not
394 # a directory, same behaviour than os.path.isdir().
395 is_dir = False
396
397 if is_dir:
398 dirs.append(entry.name)
399 else:
400 nondirs.append(entry.name)
401
402 if not topdown and is_dir:
403 # Bottom-up: recurse into sub-directory, but exclude symlinks to
404 # directories if followlinks is False
405 if followlinks:
406 walk_into = True
407 else:
408 try:
409 is_symlink = entry.is_symlink()
410 except OSError:
411 # If is_symlink() raises an OSError, consider that the
412 # entry is not a symbolic link, same behaviour than
413 # os.path.islink().
414 is_symlink = False
415 walk_into = not is_symlink
416
417 if walk_into:
Serhiy Storchaka7c90a822016-02-11 13:31:00 +0200418 walk_dirs.append(entry.path)
Tim Petersc4e09402003-04-25 07:11:48 +0000419
Victor Stinner524a5ba2015-03-10 13:20:34 +0100420 # Yield before recursion if going top down
Tim Petersc4e09402003-04-25 07:11:48 +0000421 if topdown:
422 yield top, dirs, nondirs
Victor Stinner524a5ba2015-03-10 13:20:34 +0100423
Victor Stinner7fea9742015-03-18 11:29:47 +0100424 # Recurse into sub-directories
425 islink, join = path.islink, path.join
Serhiy Storchaka5f6a0b42016-02-08 16:23:28 +0200426 for dirname in dirs:
427 new_path = join(top, dirname)
Victor Stinner7fea9742015-03-18 11:29:47 +0100428 # Issue #23605: os.path.islink() is used instead of caching
429 # entry.is_symlink() result during the loop on os.scandir() because
430 # the caller can replace the directory entry during the "yield"
431 # above.
432 if followlinks or not islink(new_path):
433 yield from walk(new_path, topdown, onerror, followlinks)
434 else:
Serhiy Storchaka7c90a822016-02-11 13:31:00 +0200435 # Recurse into sub-directories
436 for new_path in walk_dirs:
437 yield from walk(new_path, topdown, onerror, followlinks)
Victor Stinner7fea9742015-03-18 11:29:47 +0100438 # Yield after recursion if going bottom up
Tim Petersc4e09402003-04-25 07:11:48 +0000439 yield top, dirs, nondirs
440
Serhiy Storchaka5f6a0b42016-02-08 16:23:28 +0200441class _DummyDirEntry:
Victor Stinnerba8b0a72016-03-24 12:23:18 +0100442 """Dummy implementation of DirEntry
443
444 Only used internally by os.walk(bytes). Since os.walk() doesn't need the
445 follow_symlinks parameter: don't implement it, always follow symbolic
446 links.
447 """
448
Serhiy Storchaka5f6a0b42016-02-08 16:23:28 +0200449 def __init__(self, dir, name):
450 self.name = name
451 self.path = path.join(dir, name)
Victor Stinnerba8b0a72016-03-24 12:23:18 +0100452 # Mimick FindFirstFile/FindNextFile: we should get file attributes
453 # while iterating on a directory
454 self._stat = None
Victor Stinner73030df2016-03-29 11:25:00 +0200455 self._lstat = None
Victor Stinnerba8b0a72016-03-24 12:23:18 +0100456 try:
Victor Stinner73030df2016-03-29 11:25:00 +0200457 self.stat(follow_symlinks=False)
Victor Stinnerba8b0a72016-03-24 12:23:18 +0100458 except OSError:
459 pass
460
Victor Stinner73030df2016-03-29 11:25:00 +0200461 def stat(self, *, follow_symlinks=True):
462 if follow_symlinks:
463 if self._stat is None:
464 self._stat = stat(self.path)
465 return self._stat
466 else:
467 if self._lstat is None:
468 self._lstat = stat(self.path, follow_symlinks=False)
469 return self._lstat
Serhiy Storchakaffe96ae2016-02-11 13:21:30 +0200470
Serhiy Storchaka5f6a0b42016-02-08 16:23:28 +0200471 def is_dir(self):
Victor Stinner73030df2016-03-29 11:25:00 +0200472 if self._lstat is not None and not self.is_symlink():
473 # use the cache lstat
474 stat = self.stat(follow_symlinks=False)
475 return st.S_ISDIR(stat.st_mode)
476
Victor Stinnerba8b0a72016-03-24 12:23:18 +0100477 stat = self.stat()
478 return st.S_ISDIR(stat.st_mode)
Serhiy Storchakaffe96ae2016-02-11 13:21:30 +0200479
Serhiy Storchaka5f6a0b42016-02-08 16:23:28 +0200480 def is_symlink(self):
Victor Stinner73030df2016-03-29 11:25:00 +0200481 stat = self.stat(follow_symlinks=False)
Victor Stinnerba8b0a72016-03-24 12:23:18 +0100482 return st.S_ISLNK(stat.st_mode)
Serhiy Storchaka5f6a0b42016-02-08 16:23:28 +0200483
Serhiy Storchakaffe96ae2016-02-11 13:21:30 +0200484class _dummy_scandir:
Serhiy Storchaka5f6a0b42016-02-08 16:23:28 +0200485 # listdir-based implementation for bytes patches on Windows
Serhiy Storchakaffe96ae2016-02-11 13:21:30 +0200486 def __init__(self, dir):
487 self.dir = dir
488 self.it = iter(listdir(dir))
489
490 def __iter__(self):
491 return self
492
493 def __next__(self):
494 return _DummyDirEntry(self.dir, next(self.it))
495
496 def __enter__(self):
497 return self
498
499 def __exit__(self, *args):
500 self.it = iter(())
Serhiy Storchaka5f6a0b42016-02-08 16:23:28 +0200501
Tim Petersc4e09402003-04-25 07:11:48 +0000502__all__.append("walk")
503
Larry Hastingsc48fe982012-06-25 04:49:05 -0700504if {open, stat} <= supports_dir_fd and {listdir, stat} <= supports_fd:
Charles-François Natali7372b062012-02-05 15:15:38 +0100505
Larry Hastingsb4038062012-07-15 10:57:38 -0700506 def fwalk(top=".", topdown=True, onerror=None, *, follow_symlinks=False, dir_fd=None):
Charles-François Natali7372b062012-02-05 15:15:38 +0100507 """Directory tree generator.
508
509 This behaves exactly like walk(), except that it yields a 4-tuple
510
511 dirpath, dirnames, filenames, dirfd
512
513 `dirpath`, `dirnames` and `filenames` are identical to walk() output,
514 and `dirfd` is a file descriptor referring to the directory `dirpath`.
515
Larry Hastingsc48fe982012-06-25 04:49:05 -0700516 The advantage of fwalk() over walk() is that it's safe against symlink
Larry Hastingsb4038062012-07-15 10:57:38 -0700517 races (when follow_symlinks is False).
Charles-François Natali7372b062012-02-05 15:15:38 +0100518
Larry Hastingsc48fe982012-06-25 04:49:05 -0700519 If dir_fd is not None, it should be a file descriptor open to a directory,
520 and top should be relative; top will then be relative to that directory.
521 (dir_fd is always supported for fwalk.)
522
Charles-François Natali7372b062012-02-05 15:15:38 +0100523 Caution:
524 Since fwalk() yields file descriptors, those are only valid until the
525 next iteration step, so you should dup() them if you want to keep them
526 for a longer period.
527
528 Example:
529
530 import os
531 for root, dirs, files, rootfd in os.fwalk('python/Lib/email'):
532 print(root, "consumes", end="")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700533 print(sum([os.stat(name, dir_fd=rootfd).st_size for name in files]),
Charles-François Natali7372b062012-02-05 15:15:38 +0100534 end="")
535 print("bytes in", len(files), "non-directory files")
536 if 'CVS' in dirs:
537 dirs.remove('CVS') # don't visit CVS directories
538 """
539 # Note: To guard against symlink races, we use the standard
540 # lstat()/open()/fstat() trick.
Larry Hastingsc48fe982012-06-25 04:49:05 -0700541 orig_st = stat(top, follow_symlinks=False, dir_fd=dir_fd)
542 topfd = open(top, O_RDONLY, dir_fd=dir_fd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100543 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700544 if (follow_symlinks or (st.S_ISDIR(orig_st.st_mode) and
545 path.samestat(orig_st, stat(topfd)))):
546 yield from _fwalk(topfd, top, topdown, onerror, follow_symlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100547 finally:
548 close(topfd)
549
Larry Hastingsb4038062012-07-15 10:57:38 -0700550 def _fwalk(topfd, toppath, topdown, onerror, follow_symlinks):
Charles-François Natali7372b062012-02-05 15:15:38 +0100551 # Note: This uses O(depth of the directory tree) file descriptors: if
552 # necessary, it can be adapted to only require O(1) FDs, see issue
553 # #13734.
554
Larry Hastings9cf065c2012-06-22 16:30:09 -0700555 names = listdir(topfd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100556 dirs, nondirs = [], []
557 for name in names:
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200558 try:
559 # Here, we don't use AT_SYMLINK_NOFOLLOW to be consistent with
560 # walk() which reports symlinks to directories as directories.
561 # We do however check for symlinks before recursing into
562 # a subdirectory.
Larry Hastings9cf065c2012-06-22 16:30:09 -0700563 if st.S_ISDIR(stat(name, dir_fd=topfd).st_mode):
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200564 dirs.append(name)
565 else:
566 nondirs.append(name)
567 except FileNotFoundError:
568 try:
569 # Add dangling symlinks, ignore disappeared files
Larry Hastings9cf065c2012-06-22 16:30:09 -0700570 if st.S_ISLNK(stat(name, dir_fd=topfd, follow_symlinks=False)
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200571 .st_mode):
572 nondirs.append(name)
573 except FileNotFoundError:
574 continue
Charles-François Natali7372b062012-02-05 15:15:38 +0100575
576 if topdown:
577 yield toppath, dirs, nondirs, topfd
578
579 for name in dirs:
580 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700581 orig_st = stat(name, dir_fd=topfd, follow_symlinks=follow_symlinks)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700582 dirfd = open(name, O_RDONLY, dir_fd=topfd)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200583 except OSError as err:
Charles-François Natali7372b062012-02-05 15:15:38 +0100584 if onerror is not None:
585 onerror(err)
Serhiy Storchaka0bddc9e2015-12-23 00:08:24 +0200586 continue
Charles-François Natali7372b062012-02-05 15:15:38 +0100587 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700588 if follow_symlinks or path.samestat(orig_st, stat(dirfd)):
Charles-François Natali7372b062012-02-05 15:15:38 +0100589 dirpath = path.join(toppath, name)
Larry Hastingsb4038062012-07-15 10:57:38 -0700590 yield from _fwalk(dirfd, dirpath, topdown, onerror, follow_symlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100591 finally:
592 close(dirfd)
593
594 if not topdown:
595 yield toppath, dirs, nondirs, topfd
596
597 __all__.append("fwalk")
598
Guido van Rossuma28dab51997-08-29 22:36:47 +0000599# Make sure os.environ exists, at least
600try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000601 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000602except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000603 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000604
Guido van Rossume65cce51993-11-08 15:05:21 +0000605def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000606 """execl(file, *args)
607
608 Execute the executable file with argument list args, replacing the
609 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000610 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000611
612def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000613 """execle(file, *args, env)
614
615 Execute the executable file with argument list args and
616 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000617 env = args[-1]
618 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000619
620def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000621 """execlp(file, *args)
622
623 Execute the executable file (which is searched for along $PATH)
624 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000625 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000626
Guido van Rossum030afb11995-03-14 17:27:18 +0000627def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000628 """execlpe(file, *args, env)
629
630 Execute the executable file (which is searched for along $PATH)
631 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000632 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000633 env = args[-1]
634 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000635
Guido van Rossume65cce51993-11-08 15:05:21 +0000636def execvp(file, args):
Matthias Klosea09c54f2010-01-31 16:48:44 +0000637 """execvp(file, args)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000638
639 Execute the executable file (which is searched for along $PATH)
640 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000641 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000642 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000643
644def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000645 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000646
647 Execute the executable file (which is searched for along $PATH)
648 with argument list args and environment env , replacing the
649 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000650 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000651 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000652
Skip Montanaro269b83b2001-02-06 01:07:02 +0000653__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
654
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000655def _execvpe(file, args, env=None):
656 if env is not None:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000657 exec_func = execve
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000658 argrest = (args, env)
659 else:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000660 exec_func = execv
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000661 argrest = (args,)
662 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000663
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000664 head, tail = path.split(file)
665 if head:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000666 exec_func(file, *argrest)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000667 return
Guido van Rossume7ba4952007-06-06 23:52:48 +0000668 last_exc = saved_exc = None
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000669 saved_tb = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000670 path_list = get_exec_path(env)
671 if name != 'nt':
672 file = fsencode(file)
673 path_list = map(fsencode, path_list)
674 for dir in path_list:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000675 fullname = path.join(dir, file)
676 try:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000677 exec_func(fullname, *argrest)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200678 except OSError as e:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000679 last_exc = e
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000680 tb = sys.exc_info()[2]
Christian Heimes45f9af32007-11-27 21:50:00 +0000681 if (e.errno != errno.ENOENT and e.errno != errno.ENOTDIR
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000682 and saved_exc is None):
683 saved_exc = e
684 saved_tb = tb
685 if saved_exc:
Benjamin Peterson4b068192009-02-20 03:19:25 +0000686 raise saved_exc.with_traceback(saved_tb)
687 raise last_exc.with_traceback(tb)
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000688
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000689
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000690def get_exec_path(env=None):
691 """Returns the sequence of directories that will be searched for the
692 named executable (similar to a shell) when launching a process.
693
694 *env* must be an environment variable dict or None. If *env* is None,
695 os.environ will be used.
696 """
Victor Stinner273b7662010-11-06 12:59:33 +0000697 # Use a local import instead of a global import to limit the number of
698 # modules loaded at startup: the os module is always loaded at startup by
699 # Python. It may also avoid a bootstrap issue.
Victor Stinner6f35eda2010-10-29 00:38:58 +0000700 import warnings
701
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000702 if env is None:
703 env = environ
Victor Stinnerb745a742010-05-18 17:17:23 +0000704
Victor Stinnerbb4f2182010-11-07 15:43:39 +0000705 # {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a
706 # BytesWarning when using python -b or python -bb: ignore the warning
Victor Stinner273b7662010-11-06 12:59:33 +0000707 with warnings.catch_warnings():
708 warnings.simplefilter("ignore", BytesWarning)
Victor Stinnerb745a742010-05-18 17:17:23 +0000709
Victor Stinnerb745a742010-05-18 17:17:23 +0000710 try:
Victor Stinner273b7662010-11-06 12:59:33 +0000711 path_list = env.get('PATH')
712 except TypeError:
713 path_list = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000714
Victor Stinner273b7662010-11-06 12:59:33 +0000715 if supports_bytes_environ:
716 try:
717 path_listb = env[b'PATH']
718 except (KeyError, TypeError):
719 pass
720 else:
721 if path_list is not None:
722 raise ValueError(
723 "env cannot contain 'PATH' and b'PATH' keys")
724 path_list = path_listb
725
726 if path_list is not None and isinstance(path_list, bytes):
727 path_list = fsdecode(path_list)
Victor Stinnerb745a742010-05-18 17:17:23 +0000728
729 if path_list is None:
730 path_list = defpath
731 return path_list.split(pathsep)
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000732
733
Skip Montanaro289bc052007-08-17 02:30:27 +0000734# Change environ to automatically call putenv(), unsetenv if they exist.
Christian Heimesf1dc3ee2013-10-13 02:04:20 +0200735from _collections_abc import MutableMapping
Skip Montanaro289bc052007-08-17 02:30:27 +0000736
737class _Environ(MutableMapping):
Victor Stinner84ae1182010-05-06 22:05:07 +0000738 def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv):
739 self.encodekey = encodekey
740 self.decodekey = decodekey
741 self.encodevalue = encodevalue
742 self.decodevalue = decodevalue
Skip Montanaro289bc052007-08-17 02:30:27 +0000743 self.putenv = putenv
744 self.unsetenv = unsetenv
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000745 self._data = data
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000746
Skip Montanaro289bc052007-08-17 02:30:27 +0000747 def __getitem__(self, key):
Victor Stinner6d101392013-04-14 16:35:04 +0200748 try:
749 value = self._data[self.encodekey(key)]
750 except KeyError:
751 # raise KeyError with the original key value
Victor Stinner0c2dd0c2013-08-23 19:19:15 +0200752 raise KeyError(key) from None
Victor Stinner84ae1182010-05-06 22:05:07 +0000753 return self.decodevalue(value)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000754
Skip Montanaro289bc052007-08-17 02:30:27 +0000755 def __setitem__(self, key, value):
Victor Stinner84ae1182010-05-06 22:05:07 +0000756 key = self.encodekey(key)
757 value = self.encodevalue(value)
Skip Montanaro289bc052007-08-17 02:30:27 +0000758 self.putenv(key, value)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000759 self._data[key] = value
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000760
Skip Montanaro289bc052007-08-17 02:30:27 +0000761 def __delitem__(self, key):
Victor Stinner6d101392013-04-14 16:35:04 +0200762 encodedkey = self.encodekey(key)
763 self.unsetenv(encodedkey)
764 try:
765 del self._data[encodedkey]
766 except KeyError:
767 # raise KeyError with the original key value
Victor Stinner0c2dd0c2013-08-23 19:19:15 +0200768 raise KeyError(key) from None
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000769
Skip Montanaro289bc052007-08-17 02:30:27 +0000770 def __iter__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000771 for key in self._data:
Victor Stinner84ae1182010-05-06 22:05:07 +0000772 yield self.decodekey(key)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000773
Skip Montanaro289bc052007-08-17 02:30:27 +0000774 def __len__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000775 return len(self._data)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000776
777 def __repr__(self):
Victor Stinnerbed71172010-07-28 21:25:42 +0000778 return 'environ({{{}}})'.format(', '.join(
Victor Stinnerd73c1a32010-07-28 21:23:23 +0000779 ('{!r}: {!r}'.format(self.decodekey(key), self.decodevalue(value))
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000780 for key, value in self._data.items())))
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000781
Skip Montanaro289bc052007-08-17 02:30:27 +0000782 def copy(self):
783 return dict(self)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000784
Skip Montanaro289bc052007-08-17 02:30:27 +0000785 def setdefault(self, key, value):
786 if key not in self:
787 self[key] = value
788 return self[key]
789
790try:
791 _putenv = putenv
792except NameError:
793 _putenv = lambda key, value: None
Richard Oudkerkc41917f2013-05-07 14:36:51 +0100794else:
795 if "putenv" not in __all__:
796 __all__.append("putenv")
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000797
Skip Montanaro289bc052007-08-17 02:30:27 +0000798try:
799 _unsetenv = unsetenv
800except NameError:
801 _unsetenv = lambda key: _putenv(key, "")
Richard Oudkerkc41917f2013-05-07 14:36:51 +0100802else:
803 if "unsetenv" not in __all__:
804 __all__.append("unsetenv")
Guido van Rossumc524d952001-10-19 01:31:59 +0000805
Victor Stinner84ae1182010-05-06 22:05:07 +0000806def _createenviron():
Jesus Cea4791a242012-10-05 03:15:39 +0200807 if name == 'nt':
Victor Stinner84ae1182010-05-06 22:05:07 +0000808 # Where Env Var Names Must Be UPPERCASE
809 def check_str(value):
810 if not isinstance(value, str):
811 raise TypeError("str expected, not %s" % type(value).__name__)
812 return value
813 encode = check_str
814 decode = str
815 def encodekey(key):
816 return encode(key).upper()
817 data = {}
818 for key, value in environ.items():
819 data[encodekey(key)] = value
820 else:
821 # Where Env Var Names Can Be Mixed Case
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000822 encoding = sys.getfilesystemencoding()
Victor Stinner84ae1182010-05-06 22:05:07 +0000823 def encode(value):
824 if not isinstance(value, str):
825 raise TypeError("str expected, not %s" % type(value).__name__)
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000826 return value.encode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000827 def decode(value):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000828 return value.decode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000829 encodekey = encode
830 data = environ
831 return _Environ(data,
832 encodekey, decode,
833 encode, decode,
834 _putenv, _unsetenv)
Guido van Rossumc524d952001-10-19 01:31:59 +0000835
Victor Stinner84ae1182010-05-06 22:05:07 +0000836# unicode environ
837environ = _createenviron()
838del _createenviron
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000839
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000840
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000841def getenv(key, default=None):
Tim Peters2c60f7a2003-01-29 03:49:43 +0000842 """Get an environment variable, return None if it doesn't exist.
Victor Stinner84ae1182010-05-06 22:05:07 +0000843 The optional second argument can specify an alternate default.
844 key, default and the result are str."""
Tim Peters2c60f7a2003-01-29 03:49:43 +0000845 return environ.get(key, default)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000846
Jesus Cea4791a242012-10-05 03:15:39 +0200847supports_bytes_environ = (name != 'nt')
Victor Stinnerb745a742010-05-18 17:17:23 +0000848__all__.extend(("getenv", "supports_bytes_environ"))
849
850if supports_bytes_environ:
Victor Stinner84ae1182010-05-06 22:05:07 +0000851 def _check_bytes(value):
852 if not isinstance(value, bytes):
853 raise TypeError("bytes expected, not %s" % type(value).__name__)
854 return value
855
856 # bytes environ
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000857 environb = _Environ(environ._data,
Victor Stinner84ae1182010-05-06 22:05:07 +0000858 _check_bytes, bytes,
859 _check_bytes, bytes,
860 _putenv, _unsetenv)
861 del _check_bytes
862
863 def getenvb(key, default=None):
864 """Get an environment variable, return None if it doesn't exist.
865 The optional second argument can specify an alternate default.
866 key, default and the result are bytes."""
867 return environb.get(key, default)
Victor Stinner70120e22010-07-29 17:19:38 +0000868
869 __all__.extend(("environb", "getenvb"))
Victor Stinner84ae1182010-05-06 22:05:07 +0000870
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000871def _fscodec():
872 encoding = sys.getfilesystemencoding()
873 if encoding == 'mbcs':
Victor Stinnere882aac2010-10-24 21:12:26 +0000874 errors = 'strict'
Victor Stinner313a1202010-06-11 23:56:51 +0000875 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000876 errors = 'surrogateescape'
Victor Stinnere8d51452010-08-19 01:05:19 +0000877
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000878 def fsencode(filename):
879 """
Ethan Furmanc1cbeed2016-06-04 10:19:27 -0700880 Encode filename (an os.PathLike, bytes, or str) to the filesystem
881 encoding with 'surrogateescape' error handler, return bytes unchanged.
882 On Windows, use 'strict' error handler if the file system encoding is
883 'mbcs' (which is the default encoding).
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000884 """
Ethan Furmanc1cbeed2016-06-04 10:19:27 -0700885 filename = fspath(filename)
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000886 if isinstance(filename, bytes):
887 return filename
888 elif isinstance(filename, str):
889 return filename.encode(encoding, errors)
Victor Stinnere8d51452010-08-19 01:05:19 +0000890 else:
Ethan Furmanc1cbeed2016-06-04 10:19:27 -0700891 raise TypeError("expected str, bytes or os.PathLike object, not "
892 + path_type.__name__)
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000893
894 def fsdecode(filename):
895 """
Ethan Furmanc1cbeed2016-06-04 10:19:27 -0700896 Decode filename (an os.PathLike, bytes, or str) from the filesystem
897 encoding with 'surrogateescape' error handler, return str unchanged. On
898 Windows, use 'strict' error handler if the file system encoding is
899 'mbcs' (which is the default encoding).
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000900 """
Ethan Furmanc1cbeed2016-06-04 10:19:27 -0700901 filename = fspath(filename)
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000902 if isinstance(filename, str):
903 return filename
904 elif isinstance(filename, bytes):
905 return filename.decode(encoding, errors)
906 else:
Ethan Furmanc1cbeed2016-06-04 10:19:27 -0700907 raise TypeError("expected str, bytes or os.PathLike object, not "
908 + path_type.__name__)
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000909
910 return fsencode, fsdecode
911
912fsencode, fsdecode = _fscodec()
913del _fscodec
Victor Stinner449c4662010-05-08 11:10:09 +0000914
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000915# Supply spawn*() (probably only for Unix)
916if _exists("fork") and not _exists("spawnv") and _exists("execv"):
917
918 P_WAIT = 0
919 P_NOWAIT = P_NOWAITO = 1
920
Petri Lehtinen3bc37f22012-05-23 21:36:16 +0300921 __all__.extend(["P_WAIT", "P_NOWAIT", "P_NOWAITO"])
922
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000923 # XXX Should we support P_DETACH? I suppose it could fork()**2
924 # and close the std I/O streams. Also, P_OVERLAY is the same
925 # as execv*()?
926
927 def _spawnvef(mode, file, args, env, func):
928 # Internal helper; func is the exec*() function to use
929 pid = fork()
930 if not pid:
931 # Child
932 try:
933 if env is None:
934 func(file, args)
935 else:
936 func(file, args, env)
937 except:
938 _exit(127)
939 else:
940 # Parent
941 if mode == P_NOWAIT:
942 return pid # Caller is responsible for waiting!
943 while 1:
944 wpid, sts = waitpid(pid, 0)
945 if WIFSTOPPED(sts):
946 continue
947 elif WIFSIGNALED(sts):
948 return -WTERMSIG(sts)
949 elif WIFEXITED(sts):
950 return WEXITSTATUS(sts)
951 else:
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200952 raise OSError("Not stopped, signaled or exited???")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000953
954 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000955 """spawnv(mode, file, args) -> integer
956
957Execute file with arguments from args in a subprocess.
958If mode == P_NOWAIT return the pid of the process.
959If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000960otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000961 return _spawnvef(mode, file, args, None, execv)
962
963 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000964 """spawnve(mode, file, args, env) -> integer
965
966Execute file with arguments from args in a subprocess with the
967specified environment.
968If mode == P_NOWAIT return the pid of the process.
969If mode == P_WAIT return the process's exit code if it exits normally;
970otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000971 return _spawnvef(mode, file, args, env, execve)
972
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000973 # Note: spawnvp[e] is't currently supported on Windows
974
975 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000976 """spawnvp(mode, file, args) -> integer
977
978Execute file (which is looked for along $PATH) with arguments from
979args in a subprocess.
980If mode == P_NOWAIT return the pid of the process.
981If mode == P_WAIT return the process's exit code if it exits normally;
982otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000983 return _spawnvef(mode, file, args, None, execvp)
984
985 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000986 """spawnvpe(mode, file, args, env) -> integer
987
988Execute file (which is looked for along $PATH) with arguments from
989args in a subprocess with the supplied environment.
990If mode == P_NOWAIT return the pid of the process.
991If mode == P_WAIT return the process's exit code if it exits normally;
992otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000993 return _spawnvef(mode, file, args, env, execvpe)
994
Richard Oudkerkad34ef82013-05-07 14:23:42 +0100995
996 __all__.extend(["spawnv", "spawnve", "spawnvp", "spawnvpe"])
997
998
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000999if _exists("spawnv"):
1000 # These aren't supplied by the basic Windows code
1001 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +00001002
1003 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +00001004 """spawnl(mode, file, *args) -> integer
1005
1006Execute file with arguments from args in a subprocess.
1007If mode == P_NOWAIT return the pid of the process.
1008If mode == P_WAIT return the process's exit code if it exits normally;
1009otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +00001010 return spawnv(mode, file, args)
1011
1012 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +00001013 """spawnle(mode, file, *args, env) -> integer
1014
1015Execute file with arguments from args in a subprocess with the
1016supplied environment.
1017If mode == P_NOWAIT return the pid of the process.
1018If mode == P_WAIT return the process's exit code if it exits normally;
1019otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +00001020 env = args[-1]
1021 return spawnve(mode, file, args[:-1], env)
1022
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00001023
Richard Oudkerkad34ef82013-05-07 14:23:42 +01001024 __all__.extend(["spawnl", "spawnle"])
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00001025
1026
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +00001027if _exists("spawnvp"):
1028 # At the moment, Windows doesn't implement spawnvp[e],
1029 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +00001030 def spawnlp(mode, file, *args):
Neal Norwitzb7f68102003-07-02 02:49:33 +00001031 """spawnlp(mode, file, *args) -> integer
Guido van Rossume0cd2912000-04-21 18:35:36 +00001032
1033Execute file (which is looked for along $PATH) with arguments from
1034args in a subprocess with the supplied environment.
1035If mode == P_NOWAIT return the pid of the process.
1036If mode == P_WAIT return the process's exit code if it exits normally;
1037otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +00001038 return spawnvp(mode, file, args)
1039
1040 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +00001041 """spawnlpe(mode, file, *args, env) -> integer
1042
1043Execute file (which is looked for along $PATH) with arguments from
1044args in a subprocess with the supplied environment.
1045If mode == P_NOWAIT return the pid of the process.
1046If mode == P_WAIT return the process's exit code if it exits normally;
1047otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +00001048 env = args[-1]
1049 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +00001050
1051
Richard Oudkerkad34ef82013-05-07 14:23:42 +01001052 __all__.extend(["spawnlp", "spawnlpe"])
1053
Skip Montanaro269b83b2001-02-06 01:07:02 +00001054
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001055# Supply os.popen()
Antoine Pitrou877766d2011-03-19 17:00:37 +01001056def popen(cmd, mode="r", buffering=-1):
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001057 if not isinstance(cmd, str):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001058 raise TypeError("invalid cmd type (%s, expected string)" % type(cmd))
1059 if mode not in ("r", "w"):
1060 raise ValueError("invalid mode %r" % mode)
Benjamin Petersonb29614e2012-10-09 11:16:03 -04001061 if buffering == 0 or buffering is None:
Antoine Pitrou877766d2011-03-19 17:00:37 +01001062 raise ValueError("popen() does not support unbuffered streams")
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001063 import subprocess, io
1064 if mode == "r":
1065 proc = subprocess.Popen(cmd,
1066 shell=True,
1067 stdout=subprocess.PIPE,
1068 bufsize=buffering)
1069 return _wrap_close(io.TextIOWrapper(proc.stdout), proc)
1070 else:
1071 proc = subprocess.Popen(cmd,
1072 shell=True,
1073 stdin=subprocess.PIPE,
1074 bufsize=buffering)
1075 return _wrap_close(io.TextIOWrapper(proc.stdin), proc)
1076
1077# Helper for popen() -- a proxy for a file whose close waits for the process
1078class _wrap_close:
1079 def __init__(self, stream, proc):
1080 self._stream = stream
1081 self._proc = proc
1082 def close(self):
1083 self._stream.close()
Amaury Forgeot d'Arc97e5f282009-07-11 09:35:13 +00001084 returncode = self._proc.wait()
1085 if returncode == 0:
1086 return None
1087 if name == 'nt':
1088 return returncode
1089 else:
1090 return returncode << 8 # Shift left to match old behavior
Antoine Pitrouac625352009-12-09 00:01:27 +00001091 def __enter__(self):
1092 return self
1093 def __exit__(self, *args):
1094 self.close()
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001095 def __getattr__(self, name):
1096 return getattr(self._stream, name)
Thomas Heller476157b2007-09-04 11:27:47 +00001097 def __iter__(self):
1098 return iter(self._stream)
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001099
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +00001100# Supply os.fdopen()
1101def fdopen(fd, *args, **kwargs):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001102 if not isinstance(fd, int):
1103 raise TypeError("invalid fd type (%s, expected integer)" % type(fd))
1104 import io
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +00001105 return io.open(fd, *args, **kwargs)
Ethan Furmancdc08792016-06-02 15:06:09 -07001106
Ethan Furman410ef8e2016-06-04 12:06:26 -07001107# Supply os.fspath() if not defined in C
1108if not _exists('fspath'):
1109 def fspath(path):
1110 """Return the string representation of the path.
Ethan Furmancdc08792016-06-02 15:06:09 -07001111
Ethan Furman410ef8e2016-06-04 12:06:26 -07001112 If str or bytes is passed in, it is returned unchanged.
1113 """
1114 if isinstance(path, (str, bytes)):
1115 return path
Ethan Furmancdc08792016-06-02 15:06:09 -07001116
Ethan Furman410ef8e2016-06-04 12:06:26 -07001117 # Work from the object's type to match method resolution of other magic
1118 # methods.
1119 path_type = type(path)
1120 try:
1121 return path_type.__fspath__(path)
1122 except AttributeError:
1123 if hasattr(path_type, '__fspath__'):
1124 raise
Ethan Furmancdc08792016-06-02 15:06:09 -07001125
Ethan Furman410ef8e2016-06-04 12:06:26 -07001126 raise TypeError("expected str, bytes or os.PathLike object, not "
1127 + path_type.__name__)
Ethan Furman958b3e42016-06-04 12:49:35 -07001128
1129class PathLike(abc.ABC):
1130 """
1131 Abstract base class for implementing the file system path protocol.
1132 """
1133 @abc.abstractmethod
1134 def __fspath__(self):
1135 """
1136 Return the file system path representation of the object.
1137 """
1138 raise NotImplementedError
1139
1140 @classmethod
1141 def __subclasshook__(cls, subclass):
1142 return hasattr(subclass, '__fspath__')