blob: 52d3f1d7415854e7baf7f5ac564ef4629c648449 [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:
Larry Hastings10108a72016-09-05 15:11:23 -07004 - all functions from posix or nt, e.g. unlink, stat, etc.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +00005 - os.path is either posixpath or ntpath
Larry Hastings10108a72016-09-05 15:11:23 -07006 - os.name is either 'posix' or 'nt'
Ned Deilybf090e32016-10-01 21:12:35 -04007 - os.curdir is a string representing the current directory (always '.')
8 - os.pardir is a string representing the parent directory (always '..')
9 - os.sep is the (or a most common) pathname separator ('/' 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
Serhiy Storchaka81108372017-09-26 00:55:55 +030026import sys
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 Rossum2979b011994-08-01 11:18:30 +000088else:
Brett Cannoncd171c82013-07-04 17:43:24 -040089 raise ImportError('no os specific module found')
Guido van Rossume65cce51993-11-08 15:05:21 +000090
Skip Montanaro117910d2003-02-14 19:35:31 +000091sys.modules['os.path'] = path
Georg Brandled5b9b32008-12-05 07:45:54 +000092from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep,
93 devnull)
Skip Montanaro269b83b2001-02-06 01:07:02 +000094
Guido van Rossuma28dab51997-08-29 22:36:47 +000095del _names
96
Larry Hastings9cf065c2012-06-22 16:30:09 -070097
98if _exists("_have_functions"):
99 _globals = globals()
100 def _add(str, fn):
101 if (fn in _globals) and (str in _have_functions):
102 _set.add(_globals[fn])
103
104 _set = set()
105 _add("HAVE_FACCESSAT", "access")
106 _add("HAVE_FCHMODAT", "chmod")
107 _add("HAVE_FCHOWNAT", "chown")
108 _add("HAVE_FSTATAT", "stat")
109 _add("HAVE_FUTIMESAT", "utime")
110 _add("HAVE_LINKAT", "link")
111 _add("HAVE_MKDIRAT", "mkdir")
112 _add("HAVE_MKFIFOAT", "mkfifo")
113 _add("HAVE_MKNODAT", "mknod")
114 _add("HAVE_OPENAT", "open")
115 _add("HAVE_READLINKAT", "readlink")
116 _add("HAVE_RENAMEAT", "rename")
117 _add("HAVE_SYMLINKAT", "symlink")
118 _add("HAVE_UNLINKAT", "unlink")
Larry Hastingsb698d8e2012-06-23 16:55:07 -0700119 _add("HAVE_UNLINKAT", "rmdir")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700120 _add("HAVE_UTIMENSAT", "utime")
121 supports_dir_fd = _set
122
123 _set = set()
124 _add("HAVE_FACCESSAT", "access")
125 supports_effective_ids = _set
126
127 _set = set()
128 _add("HAVE_FCHDIR", "chdir")
129 _add("HAVE_FCHMOD", "chmod")
130 _add("HAVE_FCHOWN", "chown")
131 _add("HAVE_FDOPENDIR", "listdir")
Serhiy Storchakaea720fe2017-03-30 09:12:31 +0300132 _add("HAVE_FDOPENDIR", "scandir")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700133 _add("HAVE_FEXECVE", "execve")
134 _set.add(stat) # fstat always works
Georg Brandl306336b2012-06-24 12:55:33 +0200135 _add("HAVE_FTRUNCATE", "truncate")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700136 _add("HAVE_FUTIMENS", "utime")
137 _add("HAVE_FUTIMES", "utime")
Georg Brandl306336b2012-06-24 12:55:33 +0200138 _add("HAVE_FPATHCONF", "pathconf")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700139 if _exists("statvfs") and _exists("fstatvfs"): # mac os x10.3
140 _add("HAVE_FSTATVFS", "statvfs")
141 supports_fd = _set
142
143 _set = set()
144 _add("HAVE_FACCESSAT", "access")
Larry Hastingsdbbc0c82012-06-22 19:50:21 -0700145 # Some platforms don't support lchmod(). Often the function exists
146 # anyway, as a stub that always returns ENOSUP or perhaps EOPNOTSUPP.
147 # (No, I don't know why that's a good design.) ./configure will detect
148 # this and reject it--so HAVE_LCHMOD still won't be defined on such
149 # platforms. This is Very Helpful.
150 #
151 # However, sometimes platforms without a working lchmod() *do* have
152 # fchmodat(). (Examples: Linux kernel 3.2 with glibc 2.15,
153 # OpenIndiana 3.x.) And fchmodat() has a flag that theoretically makes
154 # it behave like lchmod(). So in theory it would be a suitable
155 # replacement for lchmod(). But when lchmod() doesn't work, fchmodat()'s
156 # flag doesn't work *either*. Sadly ./configure isn't sophisticated
157 # enough to detect this condition--it only determines whether or not
158 # fchmodat() minimally works.
159 #
160 # Therefore we simply ignore fchmodat() when deciding whether or not
161 # os.chmod supports follow_symlinks. Just checking lchmod() is
162 # sufficient. After all--if you have a working fchmodat(), your
163 # lchmod() almost certainly works too.
164 #
165 # _add("HAVE_FCHMODAT", "chmod")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700166 _add("HAVE_FCHOWNAT", "chown")
167 _add("HAVE_FSTATAT", "stat")
168 _add("HAVE_LCHFLAGS", "chflags")
169 _add("HAVE_LCHMOD", "chmod")
170 if _exists("lchown"): # mac os x10.3
171 _add("HAVE_LCHOWN", "chown")
172 _add("HAVE_LINKAT", "link")
173 _add("HAVE_LUTIMES", "utime")
174 _add("HAVE_LSTAT", "stat")
175 _add("HAVE_FSTATAT", "stat")
176 _add("HAVE_UTIMENSAT", "utime")
177 _add("MS_WINDOWS", "stat")
178 supports_follow_symlinks = _set
179
Larry Hastings9cf065c2012-06-22 16:30:09 -0700180 del _set
181 del _have_functions
182 del _globals
183 del _add
184
185
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000186# Python uses fixed values for the SEEK_ constants; they are mapped
187# to native constants if necessary in posixmodule.c
Jesus Cea94363612012-06-22 18:32:07 +0200188# Other possible SEEK values are directly imported from posixmodule.c
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000189SEEK_SET = 0
190SEEK_CUR = 1
191SEEK_END = 2
192
Guido van Rossum4def7de1998-07-24 20:48:03 +0000193# Super directory utilities.
194# (Inspired by Eric Raymond; the doc strings are mostly his)
195
Terry Reedy5a22b652010-12-02 07:05:56 +0000196def makedirs(name, mode=0o777, exist_ok=False):
Zachary Warea22ae212014-03-20 09:42:01 -0500197 """makedirs(name [, mode=0o777][, exist_ok=False])
Guido van Rossum4def7de1998-07-24 20:48:03 +0000198
Benjamin Petersonee5f1c12014-04-01 19:13:18 -0400199 Super-mkdir; create a leaf directory and all intermediate ones. Works like
200 mkdir, except that any intermediate path segment (not just the rightmost)
201 will be created if it does not exist. If the target directory already
202 exists, raise an OSError if exist_ok is False. Otherwise no exception is
Terry Reedy5a22b652010-12-02 07:05:56 +0000203 raised. This is recursive.
Guido van Rossum4def7de1998-07-24 20:48:03 +0000204
205 """
206 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000207 if not tail:
208 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000209 if head and tail and not path.exists(head):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000210 try:
Serhiy Storchakae304e332017-03-24 13:27:42 +0200211 makedirs(head, exist_ok=exist_ok)
Giampaolo Rodola'0166a282013-02-12 15:14:17 +0100212 except FileExistsError:
Martin Pantera82642f2015-11-19 04:48:44 +0000213 # Defeats race condition when another thread created the path
Giampaolo Rodola'0166a282013-02-12 15:14:17 +0100214 pass
Serhiy Storchaka4ab23bf2013-01-08 11:32:58 +0200215 cdir = curdir
216 if isinstance(tail, bytes):
217 cdir = bytes(curdir, 'ASCII')
218 if tail == cdir: # xxx/newdir/. exists if xxx/newdir exists
Andrew M. Kuchling6fccc8a2003-12-23 16:33:28 +0000219 return
Terry Reedy5a22b652010-12-02 07:05:56 +0000220 try:
221 mkdir(name, mode)
Martin Pantera82642f2015-11-19 04:48:44 +0000222 except OSError:
223 # Cannot rely on checking for EEXIST, since the operating system
224 # could give priority to other errors like EACCES or EROFS
225 if not exist_ok or not path.isdir(name):
Terry Reedy5a22b652010-12-02 07:05:56 +0000226 raise
Guido van Rossum4def7de1998-07-24 20:48:03 +0000227
228def removedirs(name):
Zachary Warea22ae212014-03-20 09:42:01 -0500229 """removedirs(name)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000230
Fredrik Lundh96c1c7a2005-11-12 15:55:04 +0000231 Super-rmdir; remove a leaf directory and all empty intermediate
Guido van Rossum4def7de1998-07-24 20:48:03 +0000232 ones. Works like rmdir except that, if the leaf directory is
233 successfully removed, directories corresponding to rightmost path
Tim Petersc4e09402003-04-25 07:11:48 +0000234 segments will be pruned away until either the whole path is
Guido van Rossum4def7de1998-07-24 20:48:03 +0000235 consumed or an error occurs. Errors during this latter phase are
236 ignored -- they generally mean that a directory was not empty.
237
238 """
239 rmdir(name)
240 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000241 if not tail:
242 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000243 while head and tail:
244 try:
245 rmdir(head)
Andrew Svetlov2552bc02012-12-24 21:47:24 +0200246 except OSError:
Guido van Rossum4def7de1998-07-24 20:48:03 +0000247 break
248 head, tail = path.split(head)
249
250def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000251 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000252
253 Super-rename; create directories as necessary and delete any left
254 empty. Works like rename, except creation of any intermediate
255 directories needed to make the new pathname good is attempted
256 first. After the rename, directories corresponding to rightmost
Benjamin Peterson52a3b742015-04-13 20:24:10 -0400257 path segments of the old name will be pruned until either the
Guido van Rossum4def7de1998-07-24 20:48:03 +0000258 whole path is consumed or a nonempty directory is found.
259
260 Note: this function can fail with the new directory structure made
261 if you lack permissions needed to unlink the leaf directory or
262 file.
263
264 """
265 head, tail = path.split(new)
266 if head and tail and not path.exists(head):
267 makedirs(head)
268 rename(old, new)
269 head, tail = path.split(old)
270 if head and tail:
271 try:
272 removedirs(head)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200273 except OSError:
Guido van Rossum4def7de1998-07-24 20:48:03 +0000274 pass
275
Skip Montanaro269b83b2001-02-06 01:07:02 +0000276__all__.extend(["makedirs", "removedirs", "renames"])
277
Guido van Rossumd8faa362007-04-27 19:54:29 +0000278def walk(top, topdown=True, onerror=None, followlinks=False):
Tim Petersc4e09402003-04-25 07:11:48 +0000279 """Directory tree generator.
280
281 For each directory in the directory tree rooted at top (including top
282 itself, but excluding '.' and '..'), yields a 3-tuple
283
284 dirpath, dirnames, filenames
285
286 dirpath is a string, the path to the directory. dirnames is a list of
287 the names of the subdirectories in dirpath (excluding '.' and '..').
288 filenames is a list of the names of the non-directory files in dirpath.
289 Note that the names in the lists are just names, with no path components.
290 To get a full path (which begins with top) to a file or directory in
291 dirpath, do os.path.join(dirpath, name).
292
293 If optional arg 'topdown' is true or not specified, the triple for a
294 directory is generated before the triples for any of its subdirectories
295 (directories are generated top down). If topdown is false, the triple
296 for a directory is generated after the triples for all of its
297 subdirectories (directories are generated bottom up).
298
299 When topdown is true, the caller can modify the dirnames list in-place
300 (e.g., via del or slice assignment), and walk will only recurse into the
Benjamin Petersone58e0c72014-06-15 20:51:12 -0700301 subdirectories whose names remain in dirnames; this can be used to prune the
302 search, or to impose a specific order of visiting. Modifying dirnames when
Miss Islington (bot)c43f26e2019-09-10 06:21:57 -0700303 topdown is false has no effect on the behavior of os.walk(), since the
304 directories in dirnames have already been generated by the time dirnames
305 itself is generated. No matter the value of topdown, the list of
306 subdirectories is retrieved before the tuples for the directory and its
307 subdirectories are generated.
Tim Petersc4e09402003-04-25 07:11:48 +0000308
Victor Stinner524a5ba2015-03-10 13:20:34 +0100309 By default errors from the os.scandir() call are ignored. If
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000310 optional arg 'onerror' is specified, it should be a function; it
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200311 will be called with one argument, an OSError instance. It can
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000312 report the error to continue with the walk, or raise the exception
313 to abort the walk. Note that the filename is available as the
314 filename attribute of the exception object.
315
Guido van Rossumd8faa362007-04-27 19:54:29 +0000316 By default, os.walk does not follow symbolic links to subdirectories on
317 systems that support them. In order to get this functionality, set the
318 optional argument 'followlinks' to true.
319
Tim Petersc4e09402003-04-25 07:11:48 +0000320 Caution: if you pass a relative pathname for top, don't change the
321 current working directory between resumptions of walk. walk never
322 changes the current directory, and assumes that the client doesn't
323 either.
324
325 Example:
326
Christian Heimes5d8da202008-05-06 13:58:24 +0000327 import os
Tim Petersc4e09402003-04-25 07:11:48 +0000328 from os.path import join, getsize
Christian Heimes5d8da202008-05-06 13:58:24 +0000329 for root, dirs, files in os.walk('python/Lib/email'):
Neal Norwitz752abd02008-05-13 04:55:24 +0000330 print(root, "consumes", end="")
Recursing3ce3dea2018-12-23 04:48:14 +0100331 print(sum(getsize(join(root, name)) for name in files), end="")
Neal Norwitz752abd02008-05-13 04:55:24 +0000332 print("bytes in", len(files), "non-directory files")
Tim Petersc4e09402003-04-25 07:11:48 +0000333 if 'CVS' in dirs:
334 dirs.remove('CVS') # don't visit CVS directories
Benjamin Petersone58e0c72014-06-15 20:51:12 -0700335
Tim Petersc4e09402003-04-25 07:11:48 +0000336 """
Brett Cannon3f9183b2016-08-26 14:44:48 -0700337 top = fspath(top)
Victor Stinner524a5ba2015-03-10 13:20:34 +0100338 dirs = []
339 nondirs = []
Serhiy Storchaka7c90a822016-02-11 13:31:00 +0200340 walk_dirs = []
Tim Petersc4e09402003-04-25 07:11:48 +0000341
342 # We may not have read permission for top, in which case we can't
Alexandre Vassalotti4e6531e2008-05-09 20:00:17 +0000343 # get a list of the files the directory contains. os.walk
Tim Petersc4e09402003-04-25 07:11:48 +0000344 # always suppressed the exception then, rather than blow up for a
345 # minor reason when (say) a thousand readable directories are still
346 # left to visit. That logic is copied here.
347 try:
Serhiy Storchaka3ae41552016-10-05 23:17:10 +0300348 # Note that scandir is global in this module due
349 # to earlier import-*.
350 scandir_it = scandir(top)
Victor Stinner7fea9742015-03-18 11:29:47 +0100351 except OSError as error:
352 if onerror is not None:
353 onerror(error)
354 return
355
Serhiy Storchakaffe96ae2016-02-11 13:21:30 +0200356 with scandir_it:
357 while True:
Victor Stinner524a5ba2015-03-10 13:20:34 +0100358 try:
Victor Stinner524a5ba2015-03-10 13:20:34 +0100359 try:
Serhiy Storchakaffe96ae2016-02-11 13:21:30 +0200360 entry = next(scandir_it)
361 except StopIteration:
362 break
363 except OSError as error:
364 if onerror is not None:
365 onerror(error)
366 return
Victor Stinner7fea9742015-03-18 11:29:47 +0100367
Serhiy Storchakaffe96ae2016-02-11 13:21:30 +0200368 try:
369 is_dir = entry.is_dir()
370 except OSError:
371 # If is_dir() raises an OSError, consider that the entry is not
372 # a directory, same behaviour than os.path.isdir().
373 is_dir = False
374
375 if is_dir:
376 dirs.append(entry.name)
377 else:
378 nondirs.append(entry.name)
379
380 if not topdown and is_dir:
381 # Bottom-up: recurse into sub-directory, but exclude symlinks to
382 # directories if followlinks is False
383 if followlinks:
384 walk_into = True
385 else:
386 try:
387 is_symlink = entry.is_symlink()
388 except OSError:
389 # If is_symlink() raises an OSError, consider that the
390 # entry is not a symbolic link, same behaviour than
391 # os.path.islink().
392 is_symlink = False
393 walk_into = not is_symlink
394
395 if walk_into:
Serhiy Storchaka7c90a822016-02-11 13:31:00 +0200396 walk_dirs.append(entry.path)
Tim Petersc4e09402003-04-25 07:11:48 +0000397
Victor Stinner524a5ba2015-03-10 13:20:34 +0100398 # Yield before recursion if going top down
Tim Petersc4e09402003-04-25 07:11:48 +0000399 if topdown:
400 yield top, dirs, nondirs
Victor Stinner524a5ba2015-03-10 13:20:34 +0100401
Victor Stinner7fea9742015-03-18 11:29:47 +0100402 # Recurse into sub-directories
403 islink, join = path.islink, path.join
Serhiy Storchaka5f6a0b42016-02-08 16:23:28 +0200404 for dirname in dirs:
405 new_path = join(top, dirname)
Victor Stinner7fea9742015-03-18 11:29:47 +0100406 # Issue #23605: os.path.islink() is used instead of caching
407 # entry.is_symlink() result during the loop on os.scandir() because
408 # the caller can replace the directory entry during the "yield"
409 # above.
410 if followlinks or not islink(new_path):
411 yield from walk(new_path, topdown, onerror, followlinks)
412 else:
Serhiy Storchaka7c90a822016-02-11 13:31:00 +0200413 # Recurse into sub-directories
414 for new_path in walk_dirs:
415 yield from walk(new_path, topdown, onerror, followlinks)
Victor Stinner7fea9742015-03-18 11:29:47 +0100416 # Yield after recursion if going bottom up
Tim Petersc4e09402003-04-25 07:11:48 +0000417 yield top, dirs, nondirs
418
419__all__.append("walk")
420
Serhiy Storchakaea720fe2017-03-30 09:12:31 +0300421if {open, stat} <= supports_dir_fd and {scandir, stat} <= supports_fd:
Charles-François Natali7372b062012-02-05 15:15:38 +0100422
Larry Hastingsb4038062012-07-15 10:57:38 -0700423 def fwalk(top=".", topdown=True, onerror=None, *, follow_symlinks=False, dir_fd=None):
Charles-François Natali7372b062012-02-05 15:15:38 +0100424 """Directory tree generator.
425
426 This behaves exactly like walk(), except that it yields a 4-tuple
427
428 dirpath, dirnames, filenames, dirfd
429
430 `dirpath`, `dirnames` and `filenames` are identical to walk() output,
431 and `dirfd` is a file descriptor referring to the directory `dirpath`.
432
Larry Hastingsc48fe982012-06-25 04:49:05 -0700433 The advantage of fwalk() over walk() is that it's safe against symlink
Larry Hastingsb4038062012-07-15 10:57:38 -0700434 races (when follow_symlinks is False).
Charles-François Natali7372b062012-02-05 15:15:38 +0100435
Larry Hastingsc48fe982012-06-25 04:49:05 -0700436 If dir_fd is not None, it should be a file descriptor open to a directory,
437 and top should be relative; top will then be relative to that directory.
438 (dir_fd is always supported for fwalk.)
439
Charles-François Natali7372b062012-02-05 15:15:38 +0100440 Caution:
441 Since fwalk() yields file descriptors, those are only valid until the
442 next iteration step, so you should dup() them if you want to keep them
443 for a longer period.
444
445 Example:
446
447 import os
448 for root, dirs, files, rootfd in os.fwalk('python/Lib/email'):
449 print(root, "consumes", end="")
Recursing3ce3dea2018-12-23 04:48:14 +0100450 print(sum(os.stat(name, dir_fd=rootfd).st_size for name in files),
Charles-François Natali7372b062012-02-05 15:15:38 +0100451 end="")
452 print("bytes in", len(files), "non-directory files")
453 if 'CVS' in dirs:
454 dirs.remove('CVS') # don't visit CVS directories
455 """
Brett Cannon3f9183b2016-08-26 14:44:48 -0700456 if not isinstance(top, int) or not hasattr(top, '__index__'):
457 top = fspath(top)
Charles-François Natali7372b062012-02-05 15:15:38 +0100458 # Note: To guard against symlink races, we use the standard
459 # lstat()/open()/fstat() trick.
Serhiy Storchakaea720fe2017-03-30 09:12:31 +0300460 if not follow_symlinks:
461 orig_st = stat(top, follow_symlinks=False, dir_fd=dir_fd)
Larry Hastingsc48fe982012-06-25 04:49:05 -0700462 topfd = open(top, O_RDONLY, dir_fd=dir_fd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100463 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700464 if (follow_symlinks or (st.S_ISDIR(orig_st.st_mode) and
465 path.samestat(orig_st, stat(topfd)))):
Serhiy Storchaka8f6b3442017-03-07 14:33:21 +0200466 yield from _fwalk(topfd, top, isinstance(top, bytes),
467 topdown, onerror, follow_symlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100468 finally:
469 close(topfd)
470
Serhiy Storchaka8f6b3442017-03-07 14:33:21 +0200471 def _fwalk(topfd, toppath, isbytes, topdown, onerror, follow_symlinks):
Charles-François Natali7372b062012-02-05 15:15:38 +0100472 # Note: This uses O(depth of the directory tree) file descriptors: if
473 # necessary, it can be adapted to only require O(1) FDs, see issue
474 # #13734.
475
Serhiy Storchakaea720fe2017-03-30 09:12:31 +0300476 scandir_it = scandir(topfd)
477 dirs = []
478 nondirs = []
479 entries = None if topdown or follow_symlinks else []
480 for entry in scandir_it:
481 name = entry.name
482 if isbytes:
483 name = fsencode(name)
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200484 try:
Serhiy Storchakaea720fe2017-03-30 09:12:31 +0300485 if entry.is_dir():
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200486 dirs.append(name)
Serhiy Storchakaea720fe2017-03-30 09:12:31 +0300487 if entries is not None:
488 entries.append(entry)
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200489 else:
490 nondirs.append(name)
Serhiy Storchaka42babab2016-10-25 14:28:38 +0300491 except OSError:
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200492 try:
493 # Add dangling symlinks, ignore disappeared files
Serhiy Storchakaea720fe2017-03-30 09:12:31 +0300494 if entry.is_symlink():
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200495 nondirs.append(name)
Serhiy Storchaka42babab2016-10-25 14:28:38 +0300496 except OSError:
Serhiy Storchakaea720fe2017-03-30 09:12:31 +0300497 pass
Charles-François Natali7372b062012-02-05 15:15:38 +0100498
499 if topdown:
500 yield toppath, dirs, nondirs, topfd
501
Serhiy Storchakaea720fe2017-03-30 09:12:31 +0300502 for name in dirs if entries is None else zip(dirs, entries):
Charles-François Natali7372b062012-02-05 15:15:38 +0100503 try:
Serhiy Storchakaea720fe2017-03-30 09:12:31 +0300504 if not follow_symlinks:
505 if topdown:
506 orig_st = stat(name, dir_fd=topfd, follow_symlinks=False)
507 else:
508 assert entries is not None
509 name, entry = name
510 orig_st = entry.stat(follow_symlinks=False)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700511 dirfd = open(name, O_RDONLY, dir_fd=topfd)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200512 except OSError as err:
Charles-François Natali7372b062012-02-05 15:15:38 +0100513 if onerror is not None:
514 onerror(err)
Serhiy Storchaka0bddc9e2015-12-23 00:08:24 +0200515 continue
Charles-François Natali7372b062012-02-05 15:15:38 +0100516 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700517 if follow_symlinks or path.samestat(orig_st, stat(dirfd)):
Charles-François Natali7372b062012-02-05 15:15:38 +0100518 dirpath = path.join(toppath, name)
Serhiy Storchaka8f6b3442017-03-07 14:33:21 +0200519 yield from _fwalk(dirfd, dirpath, isbytes,
520 topdown, onerror, follow_symlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100521 finally:
522 close(dirfd)
523
524 if not topdown:
525 yield toppath, dirs, nondirs, topfd
526
527 __all__.append("fwalk")
528
Guido van Rossume65cce51993-11-08 15:05:21 +0000529def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000530 """execl(file, *args)
531
532 Execute the executable file with argument list args, replacing the
533 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000534 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000535
536def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000537 """execle(file, *args, env)
538
539 Execute the executable file with argument list args and
540 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000541 env = args[-1]
542 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000543
544def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000545 """execlp(file, *args)
546
547 Execute the executable file (which is searched for along $PATH)
548 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000549 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000550
Guido van Rossum030afb11995-03-14 17:27:18 +0000551def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000552 """execlpe(file, *args, env)
553
554 Execute the executable file (which is searched for along $PATH)
555 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000556 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000557 env = args[-1]
558 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000559
Guido van Rossume65cce51993-11-08 15:05:21 +0000560def execvp(file, args):
Matthias Klosea09c54f2010-01-31 16:48:44 +0000561 """execvp(file, args)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000562
563 Execute the executable file (which is searched for along $PATH)
564 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000565 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000566 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000567
568def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000569 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000570
571 Execute the executable file (which is searched for along $PATH)
Miss Islington (bot)421ef392019-09-09 10:44:46 -0700572 with argument list args and environment env, replacing the
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000573 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000574 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000575 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000576
Skip Montanaro269b83b2001-02-06 01:07:02 +0000577__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
578
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000579def _execvpe(file, args, env=None):
580 if env is not None:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000581 exec_func = execve
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000582 argrest = (args, env)
583 else:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000584 exec_func = execv
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000585 argrest = (args,)
586 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000587
Serhiy Storchaka81108372017-09-26 00:55:55 +0300588 if path.dirname(file):
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000589 exec_func(file, *argrest)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000590 return
Serhiy Storchaka81108372017-09-26 00:55:55 +0300591 saved_exc = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000592 path_list = get_exec_path(env)
593 if name != 'nt':
594 file = fsencode(file)
595 path_list = map(fsencode, path_list)
596 for dir in path_list:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000597 fullname = path.join(dir, file)
598 try:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000599 exec_func(fullname, *argrest)
Serhiy Storchaka81108372017-09-26 00:55:55 +0300600 except (FileNotFoundError, NotADirectoryError) as e:
601 last_exc = e
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200602 except OSError as e:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000603 last_exc = e
Serhiy Storchaka81108372017-09-26 00:55:55 +0300604 if saved_exc is None:
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000605 saved_exc = e
Serhiy Storchaka81108372017-09-26 00:55:55 +0300606 if saved_exc is not None:
607 raise saved_exc
608 raise last_exc
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000609
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000610
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000611def get_exec_path(env=None):
612 """Returns the sequence of directories that will be searched for the
613 named executable (similar to a shell) when launching a process.
614
615 *env* must be an environment variable dict or None. If *env* is None,
616 os.environ will be used.
617 """
Victor Stinner273b7662010-11-06 12:59:33 +0000618 # Use a local import instead of a global import to limit the number of
619 # modules loaded at startup: the os module is always loaded at startup by
620 # Python. It may also avoid a bootstrap issue.
Victor Stinner6f35eda2010-10-29 00:38:58 +0000621 import warnings
622
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000623 if env is None:
624 env = environ
Victor Stinnerb745a742010-05-18 17:17:23 +0000625
Victor Stinnerbb4f2182010-11-07 15:43:39 +0000626 # {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a
627 # BytesWarning when using python -b or python -bb: ignore the warning
Victor Stinner273b7662010-11-06 12:59:33 +0000628 with warnings.catch_warnings():
629 warnings.simplefilter("ignore", BytesWarning)
Victor Stinnerb745a742010-05-18 17:17:23 +0000630
Victor Stinnerb745a742010-05-18 17:17:23 +0000631 try:
Victor Stinner273b7662010-11-06 12:59:33 +0000632 path_list = env.get('PATH')
633 except TypeError:
634 path_list = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000635
Victor Stinner273b7662010-11-06 12:59:33 +0000636 if supports_bytes_environ:
637 try:
638 path_listb = env[b'PATH']
639 except (KeyError, TypeError):
640 pass
641 else:
642 if path_list is not None:
643 raise ValueError(
644 "env cannot contain 'PATH' and b'PATH' keys")
645 path_list = path_listb
646
647 if path_list is not None and isinstance(path_list, bytes):
648 path_list = fsdecode(path_list)
Victor Stinnerb745a742010-05-18 17:17:23 +0000649
650 if path_list is None:
651 path_list = defpath
652 return path_list.split(pathsep)
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000653
654
Skip Montanaro289bc052007-08-17 02:30:27 +0000655# Change environ to automatically call putenv(), unsetenv if they exist.
Christian Heimesf1dc3ee2013-10-13 02:04:20 +0200656from _collections_abc import MutableMapping
Skip Montanaro289bc052007-08-17 02:30:27 +0000657
658class _Environ(MutableMapping):
Victor Stinner84ae1182010-05-06 22:05:07 +0000659 def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv):
660 self.encodekey = encodekey
661 self.decodekey = decodekey
662 self.encodevalue = encodevalue
663 self.decodevalue = decodevalue
Skip Montanaro289bc052007-08-17 02:30:27 +0000664 self.putenv = putenv
665 self.unsetenv = unsetenv
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000666 self._data = data
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000667
Skip Montanaro289bc052007-08-17 02:30:27 +0000668 def __getitem__(self, key):
Victor Stinner6d101392013-04-14 16:35:04 +0200669 try:
670 value = self._data[self.encodekey(key)]
671 except KeyError:
672 # raise KeyError with the original key value
Victor Stinner0c2dd0c2013-08-23 19:19:15 +0200673 raise KeyError(key) from None
Victor Stinner84ae1182010-05-06 22:05:07 +0000674 return self.decodevalue(value)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000675
Skip Montanaro289bc052007-08-17 02:30:27 +0000676 def __setitem__(self, key, value):
Victor Stinner84ae1182010-05-06 22:05:07 +0000677 key = self.encodekey(key)
678 value = self.encodevalue(value)
Skip Montanaro289bc052007-08-17 02:30:27 +0000679 self.putenv(key, value)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000680 self._data[key] = value
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000681
Skip Montanaro289bc052007-08-17 02:30:27 +0000682 def __delitem__(self, key):
Victor Stinner6d101392013-04-14 16:35:04 +0200683 encodedkey = self.encodekey(key)
684 self.unsetenv(encodedkey)
685 try:
686 del self._data[encodedkey]
687 except KeyError:
688 # raise KeyError with the original key value
Victor Stinner0c2dd0c2013-08-23 19:19:15 +0200689 raise KeyError(key) from None
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000690
Skip Montanaro289bc052007-08-17 02:30:27 +0000691 def __iter__(self):
Osvaldo Santana Neto8a8d2852017-07-01 14:34:45 -0300692 # list() from dict object is an atomic operation
693 keys = list(self._data)
694 for key in keys:
Victor Stinner84ae1182010-05-06 22:05:07 +0000695 yield self.decodekey(key)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000696
Skip Montanaro289bc052007-08-17 02:30:27 +0000697 def __len__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000698 return len(self._data)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000699
700 def __repr__(self):
Victor Stinnerbed71172010-07-28 21:25:42 +0000701 return 'environ({{{}}})'.format(', '.join(
Victor Stinnerd73c1a32010-07-28 21:23:23 +0000702 ('{!r}: {!r}'.format(self.decodekey(key), self.decodevalue(value))
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000703 for key, value in self._data.items())))
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000704
Skip Montanaro289bc052007-08-17 02:30:27 +0000705 def copy(self):
706 return dict(self)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000707
Skip Montanaro289bc052007-08-17 02:30:27 +0000708 def setdefault(self, key, value):
709 if key not in self:
710 self[key] = value
711 return self[key]
712
713try:
714 _putenv = putenv
715except NameError:
716 _putenv = lambda key, value: None
Richard Oudkerkc41917f2013-05-07 14:36:51 +0100717else:
718 if "putenv" not in __all__:
719 __all__.append("putenv")
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000720
Skip Montanaro289bc052007-08-17 02:30:27 +0000721try:
722 _unsetenv = unsetenv
723except NameError:
724 _unsetenv = lambda key: _putenv(key, "")
Richard Oudkerkc41917f2013-05-07 14:36:51 +0100725else:
726 if "unsetenv" not in __all__:
727 __all__.append("unsetenv")
Guido van Rossumc524d952001-10-19 01:31:59 +0000728
Victor Stinner84ae1182010-05-06 22:05:07 +0000729def _createenviron():
Jesus Cea4791a242012-10-05 03:15:39 +0200730 if name == 'nt':
Victor Stinner84ae1182010-05-06 22:05:07 +0000731 # Where Env Var Names Must Be UPPERCASE
732 def check_str(value):
733 if not isinstance(value, str):
734 raise TypeError("str expected, not %s" % type(value).__name__)
735 return value
736 encode = check_str
737 decode = str
738 def encodekey(key):
739 return encode(key).upper()
740 data = {}
741 for key, value in environ.items():
742 data[encodekey(key)] = value
743 else:
744 # Where Env Var Names Can Be Mixed Case
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000745 encoding = sys.getfilesystemencoding()
Victor Stinner84ae1182010-05-06 22:05:07 +0000746 def encode(value):
747 if not isinstance(value, str):
748 raise TypeError("str expected, not %s" % type(value).__name__)
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000749 return value.encode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000750 def decode(value):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000751 return value.decode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000752 encodekey = encode
753 data = environ
754 return _Environ(data,
755 encodekey, decode,
756 encode, decode,
757 _putenv, _unsetenv)
Guido van Rossumc524d952001-10-19 01:31:59 +0000758
Victor Stinner84ae1182010-05-06 22:05:07 +0000759# unicode environ
760environ = _createenviron()
761del _createenviron
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000762
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000763
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000764def getenv(key, default=None):
Tim Peters2c60f7a2003-01-29 03:49:43 +0000765 """Get an environment variable, return None if it doesn't exist.
Victor Stinner84ae1182010-05-06 22:05:07 +0000766 The optional second argument can specify an alternate default.
767 key, default and the result are str."""
Tim Peters2c60f7a2003-01-29 03:49:43 +0000768 return environ.get(key, default)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000769
Jesus Cea4791a242012-10-05 03:15:39 +0200770supports_bytes_environ = (name != 'nt')
Victor Stinnerb745a742010-05-18 17:17:23 +0000771__all__.extend(("getenv", "supports_bytes_environ"))
772
773if supports_bytes_environ:
Victor Stinner84ae1182010-05-06 22:05:07 +0000774 def _check_bytes(value):
775 if not isinstance(value, bytes):
776 raise TypeError("bytes expected, not %s" % type(value).__name__)
777 return value
778
779 # bytes environ
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000780 environb = _Environ(environ._data,
Victor Stinner84ae1182010-05-06 22:05:07 +0000781 _check_bytes, bytes,
782 _check_bytes, bytes,
783 _putenv, _unsetenv)
784 del _check_bytes
785
786 def getenvb(key, default=None):
787 """Get an environment variable, return None if it doesn't exist.
788 The optional second argument can specify an alternate default.
789 key, default and the result are bytes."""
790 return environb.get(key, default)
Victor Stinner70120e22010-07-29 17:19:38 +0000791
792 __all__.extend(("environb", "getenvb"))
Victor Stinner84ae1182010-05-06 22:05:07 +0000793
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000794def _fscodec():
795 encoding = sys.getfilesystemencoding()
Steve Dowercc16be82016-09-08 10:35:16 -0700796 errors = sys.getfilesystemencodeerrors()
Victor Stinnere8d51452010-08-19 01:05:19 +0000797
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000798 def fsencode(filename):
Brett Cannon5f74ebc2016-06-09 14:29:25 -0700799 """Encode filename (an os.PathLike, bytes, or str) to the filesystem
Ethan Furmanc1cbeed2016-06-04 10:19:27 -0700800 encoding with 'surrogateescape' error handler, return bytes unchanged.
801 On Windows, use 'strict' error handler if the file system encoding is
802 'mbcs' (which is the default encoding).
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000803 """
Brett Cannonc78ca1e2016-06-24 12:03:43 -0700804 filename = fspath(filename) # Does type-checking of `filename`.
805 if isinstance(filename, str):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000806 return filename.encode(encoding, errors)
Victor Stinnere8d51452010-08-19 01:05:19 +0000807 else:
Brett Cannonc78ca1e2016-06-24 12:03:43 -0700808 return filename
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000809
810 def fsdecode(filename):
Brett Cannon5f74ebc2016-06-09 14:29:25 -0700811 """Decode filename (an os.PathLike, bytes, or str) from the filesystem
Ethan Furmanc1cbeed2016-06-04 10:19:27 -0700812 encoding with 'surrogateescape' error handler, return str unchanged. On
813 Windows, use 'strict' error handler if the file system encoding is
814 'mbcs' (which is the default encoding).
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000815 """
Brett Cannonc78ca1e2016-06-24 12:03:43 -0700816 filename = fspath(filename) # Does type-checking of `filename`.
817 if isinstance(filename, bytes):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000818 return filename.decode(encoding, errors)
819 else:
Brett Cannonc78ca1e2016-06-24 12:03:43 -0700820 return filename
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000821
822 return fsencode, fsdecode
823
824fsencode, fsdecode = _fscodec()
825del _fscodec
Victor Stinner449c4662010-05-08 11:10:09 +0000826
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000827# Supply spawn*() (probably only for Unix)
828if _exists("fork") and not _exists("spawnv") and _exists("execv"):
829
830 P_WAIT = 0
831 P_NOWAIT = P_NOWAITO = 1
832
Petri Lehtinen3bc37f22012-05-23 21:36:16 +0300833 __all__.extend(["P_WAIT", "P_NOWAIT", "P_NOWAITO"])
834
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000835 # XXX Should we support P_DETACH? I suppose it could fork()**2
836 # and close the std I/O streams. Also, P_OVERLAY is the same
837 # as execv*()?
838
839 def _spawnvef(mode, file, args, env, func):
840 # Internal helper; func is the exec*() function to use
Steve Dowereccaa062016-11-19 20:11:56 -0800841 if not isinstance(args, (tuple, list)):
842 raise TypeError('argv must be a tuple or a list')
Steve Dowerbb08db42016-11-19 21:14:27 -0800843 if not args or not args[0]:
Steve Dowereccaa062016-11-19 20:11:56 -0800844 raise ValueError('argv first element cannot be empty')
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000845 pid = fork()
846 if not pid:
847 # Child
848 try:
849 if env is None:
850 func(file, args)
851 else:
852 func(file, args, env)
853 except:
854 _exit(127)
855 else:
856 # Parent
857 if mode == P_NOWAIT:
858 return pid # Caller is responsible for waiting!
859 while 1:
860 wpid, sts = waitpid(pid, 0)
861 if WIFSTOPPED(sts):
862 continue
863 elif WIFSIGNALED(sts):
864 return -WTERMSIG(sts)
865 elif WIFEXITED(sts):
866 return WEXITSTATUS(sts)
867 else:
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200868 raise OSError("Not stopped, signaled or exited???")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000869
870 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000871 """spawnv(mode, file, args) -> integer
872
873Execute file with arguments from args in a subprocess.
874If mode == P_NOWAIT return the pid of the process.
875If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000876otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000877 return _spawnvef(mode, file, args, None, execv)
878
879 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000880 """spawnve(mode, file, args, env) -> integer
881
882Execute file with arguments from args in a subprocess with the
883specified environment.
884If mode == P_NOWAIT return the pid of the process.
885If mode == P_WAIT return the process's exit code if it exits normally;
886otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000887 return _spawnvef(mode, file, args, env, execve)
888
Mike53f7a7c2017-12-14 14:04:53 +0300889 # Note: spawnvp[e] isn't currently supported on Windows
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000890
891 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000892 """spawnvp(mode, file, args) -> integer
893
894Execute file (which is looked for along $PATH) with arguments from
895args in a subprocess.
896If mode == P_NOWAIT return the pid of the process.
897If mode == P_WAIT return the process's exit code if it exits normally;
898otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000899 return _spawnvef(mode, file, args, None, execvp)
900
901 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000902 """spawnvpe(mode, file, args, env) -> integer
903
904Execute file (which is looked for along $PATH) with arguments from
905args in a subprocess with the supplied environment.
906If mode == P_NOWAIT return the pid of the process.
907If mode == P_WAIT return the process's exit code if it exits normally;
908otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000909 return _spawnvef(mode, file, args, env, execvpe)
910
Richard Oudkerkad34ef82013-05-07 14:23:42 +0100911
912 __all__.extend(["spawnv", "spawnve", "spawnvp", "spawnvpe"])
913
914
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000915if _exists("spawnv"):
916 # These aren't supplied by the basic Windows code
917 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000918
919 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000920 """spawnl(mode, file, *args) -> integer
921
922Execute file with arguments from args in a subprocess.
923If mode == P_NOWAIT return the pid of the process.
924If mode == P_WAIT return the process's exit code if it exits normally;
925otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000926 return spawnv(mode, file, args)
927
928 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000929 """spawnle(mode, file, *args, env) -> integer
930
931Execute file with arguments from args in a subprocess with the
932supplied environment.
933If mode == P_NOWAIT return the pid of the process.
934If mode == P_WAIT return the process's exit code if it exits normally;
935otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000936 env = args[-1]
937 return spawnve(mode, file, args[:-1], env)
938
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000939
Richard Oudkerkad34ef82013-05-07 14:23:42 +0100940 __all__.extend(["spawnl", "spawnle"])
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000941
942
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000943if _exists("spawnvp"):
944 # At the moment, Windows doesn't implement spawnvp[e],
945 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000946 def spawnlp(mode, file, *args):
Neal Norwitzb7f68102003-07-02 02:49:33 +0000947 """spawnlp(mode, file, *args) -> integer
Guido van Rossume0cd2912000-04-21 18:35:36 +0000948
949Execute file (which is looked for along $PATH) with arguments from
950args in a subprocess with the supplied environment.
951If mode == P_NOWAIT return the pid of the process.
952If mode == P_WAIT return the process's exit code if it exits normally;
953otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000954 return spawnvp(mode, file, args)
955
956 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000957 """spawnlpe(mode, file, *args, env) -> integer
958
959Execute file (which is looked for along $PATH) with arguments from
960args in a subprocess with the supplied environment.
961If mode == P_NOWAIT return the pid of the process.
962If mode == P_WAIT return the process's exit code if it exits normally;
963otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000964 env = args[-1]
965 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000966
967
Richard Oudkerkad34ef82013-05-07 14:23:42 +0100968 __all__.extend(["spawnlp", "spawnlpe"])
969
Skip Montanaro269b83b2001-02-06 01:07:02 +0000970
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000971# Supply os.popen()
Antoine Pitrou877766d2011-03-19 17:00:37 +0100972def popen(cmd, mode="r", buffering=-1):
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000973 if not isinstance(cmd, str):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000974 raise TypeError("invalid cmd type (%s, expected string)" % type(cmd))
975 if mode not in ("r", "w"):
976 raise ValueError("invalid mode %r" % mode)
Benjamin Petersonb29614e2012-10-09 11:16:03 -0400977 if buffering == 0 or buffering is None:
Antoine Pitrou877766d2011-03-19 17:00:37 +0100978 raise ValueError("popen() does not support unbuffered streams")
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000979 import subprocess, io
980 if mode == "r":
981 proc = subprocess.Popen(cmd,
982 shell=True,
983 stdout=subprocess.PIPE,
984 bufsize=buffering)
985 return _wrap_close(io.TextIOWrapper(proc.stdout), proc)
986 else:
987 proc = subprocess.Popen(cmd,
988 shell=True,
989 stdin=subprocess.PIPE,
990 bufsize=buffering)
991 return _wrap_close(io.TextIOWrapper(proc.stdin), proc)
992
993# Helper for popen() -- a proxy for a file whose close waits for the process
994class _wrap_close:
995 def __init__(self, stream, proc):
996 self._stream = stream
997 self._proc = proc
998 def close(self):
999 self._stream.close()
Amaury Forgeot d'Arc97e5f282009-07-11 09:35:13 +00001000 returncode = self._proc.wait()
1001 if returncode == 0:
1002 return None
1003 if name == 'nt':
1004 return returncode
1005 else:
1006 return returncode << 8 # Shift left to match old behavior
Antoine Pitrouac625352009-12-09 00:01:27 +00001007 def __enter__(self):
1008 return self
1009 def __exit__(self, *args):
1010 self.close()
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001011 def __getattr__(self, name):
1012 return getattr(self._stream, name)
Thomas Heller476157b2007-09-04 11:27:47 +00001013 def __iter__(self):
1014 return iter(self._stream)
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001015
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +00001016# Supply os.fdopen()
1017def fdopen(fd, *args, **kwargs):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001018 if not isinstance(fd, int):
1019 raise TypeError("invalid fd type (%s, expected integer)" % type(fd))
1020 import io
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +00001021 return io.open(fd, *args, **kwargs)
Ethan Furmancdc08792016-06-02 15:06:09 -07001022
Brett Cannonc78ca1e2016-06-24 12:03:43 -07001023
1024# For testing purposes, make sure the function is available when the C
1025# implementation exists.
1026def _fspath(path):
1027 """Return the path representation of a path-like object.
1028
1029 If str or bytes is passed in, it is returned unchanged. Otherwise the
1030 os.PathLike interface is used to get the path representation. If the
1031 path representation is not str or bytes, TypeError is raised. If the
1032 provided path is not str, bytes, or os.PathLike, TypeError is raised.
1033 """
1034 if isinstance(path, (str, bytes)):
1035 return path
1036
1037 # Work from the object's type to match method resolution of other magic
1038 # methods.
1039 path_type = type(path)
1040 try:
1041 path_repr = path_type.__fspath__(path)
1042 except AttributeError:
1043 if hasattr(path_type, '__fspath__'):
1044 raise
1045 else:
1046 raise TypeError("expected str, bytes or os.PathLike object, "
1047 "not " + path_type.__name__)
1048 if isinstance(path_repr, (str, bytes)):
1049 return path_repr
1050 else:
1051 raise TypeError("expected {}.__fspath__() to return str or bytes, "
1052 "not {}".format(path_type.__name__,
1053 type(path_repr).__name__))
1054
1055# If there is no C implementation, make the pure Python version the
1056# implementation as transparently as possible.
Ethan Furman410ef8e2016-06-04 12:06:26 -07001057if not _exists('fspath'):
Brett Cannonc78ca1e2016-06-24 12:03:43 -07001058 fspath = _fspath
1059 fspath.__name__ = "fspath"
Ethan Furmancdc08792016-06-02 15:06:09 -07001060
Ethan Furman958b3e42016-06-04 12:49:35 -07001061
1062class PathLike(abc.ABC):
Brett Cannon5f74ebc2016-06-09 14:29:25 -07001063
1064 """Abstract base class for implementing the file system path protocol."""
1065
Ethan Furman958b3e42016-06-04 12:49:35 -07001066 @abc.abstractmethod
1067 def __fspath__(self):
Brett Cannon5f74ebc2016-06-09 14:29:25 -07001068 """Return the file system path representation of the object."""
Ethan Furman958b3e42016-06-04 12:49:35 -07001069 raise NotImplementedError
1070
1071 @classmethod
1072 def __subclasshook__(cls, subclass):
1073 return hasattr(subclass, '__fspath__')
Steve Dower2438cdf2019-03-29 16:37:16 -07001074
1075
1076if name == 'nt':
1077 class _AddedDllDirectory:
1078 def __init__(self, path, cookie, remove_dll_directory):
1079 self.path = path
1080 self._cookie = cookie
1081 self._remove_dll_directory = remove_dll_directory
1082 def close(self):
1083 self._remove_dll_directory(self._cookie)
1084 self.path = None
1085 def __enter__(self):
1086 return self
1087 def __exit__(self, *args):
1088 self.close()
1089 def __repr__(self):
1090 if self.path:
1091 return "<AddedDllDirectory({!r})>".format(self.path)
1092 return "<AddedDllDirectory()>"
1093
1094 def add_dll_directory(path):
1095 """Add a path to the DLL search path.
1096
1097 This search path is used when resolving dependencies for imported
1098 extension modules (the module itself is resolved through sys.path),
1099 and also by ctypes.
1100
1101 Remove the directory by calling close() on the returned object or
1102 using it in a with statement.
1103 """
1104 import nt
1105 cookie = nt._add_dll_directory(path)
1106 return _AddedDllDirectory(
1107 path,
1108 cookie,
1109 nt._remove_dll_directory
1110 )