blob: 8acd6f12c3ed06c201180e73c77050f6b6285dd8 [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
Bar Hareleae87e32019-12-22 11:57:27 +020029from _collections_abc import _check_methods
30
Guido van Rossuma28dab51997-08-29 22:36:47 +000031_names = sys.builtin_module_names
32
Tim Petersc4e09402003-04-25 07:11:48 +000033# Note: more names are added to __all__ later.
Brett Cannon13962fc2008-08-18 01:45:29 +000034__all__ = ["altsep", "curdir", "pardir", "sep", "pathsep", "linesep",
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030035 "defpath", "name", "path", "devnull", "SEEK_SET", "SEEK_CUR",
36 "SEEK_END", "fsencode", "fsdecode", "get_exec_path", "fdopen",
37 "popen", "extsep"]
Skip Montanaro269b83b2001-02-06 01:07:02 +000038
Charles-François Natali7372b062012-02-05 15:15:38 +010039def _exists(name):
40 return name in globals()
41
Skip Montanaro269b83b2001-02-06 01:07:02 +000042def _get_exports_list(module):
43 try:
44 return list(module.__all__)
45 except AttributeError:
46 return [n for n in dir(module) if n[0] != '_']
47
Brett Cannonfd074152012-04-14 14:10:13 -040048# Any new dependencies of the os module and/or changes in path separator
49# requires updating importlib as well.
Guido van Rossuma28dab51997-08-29 22:36:47 +000050if 'posix' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000051 name = 'posix'
Guido van Rossume9387ea1998-05-22 15:26:04 +000052 linesep = '\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000053 from posix import *
54 try:
55 from posix import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030056 __all__.append('_exit')
Brett Cannoncd171c82013-07-04 17:43:24 -040057 except ImportError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000058 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000059 import posixpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000060
Larry Hastings9cf065c2012-06-22 16:30:09 -070061 try:
62 from posix import _have_functions
Brett Cannoncd171c82013-07-04 17:43:24 -040063 except ImportError:
Larry Hastings9cf065c2012-06-22 16:30:09 -070064 pass
Skip Montanaro269b83b2001-02-06 01:07:02 +000065
Yury Selivanov97e2e062014-09-26 12:33:06 -040066 import posix
67 __all__.extend(_get_exports_list(posix))
68 del posix
69
Guido van Rossuma28dab51997-08-29 22:36:47 +000070elif 'nt' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000071 name = 'nt'
Guido van Rossume9387ea1998-05-22 15:26:04 +000072 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000073 from nt import *
Tim Peters6757c1e2003-01-08 21:20:57 +000074 try:
75 from nt import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030076 __all__.append('_exit')
Brett Cannoncd171c82013-07-04 17:43:24 -040077 except ImportError:
Tim Peters6757c1e2003-01-08 21:20:57 +000078 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000079 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000080
Skip Montanaro269b83b2001-02-06 01:07:02 +000081 import nt
82 __all__.extend(_get_exports_list(nt))
83 del nt
84
Larry Hastings9cf065c2012-06-22 16:30:09 -070085 try:
86 from nt import _have_functions
Brett Cannoncd171c82013-07-04 17:43:24 -040087 except ImportError:
Larry Hastings9cf065c2012-06-22 16:30:09 -070088 pass
89
Guido van Rossum2979b011994-08-01 11:18:30 +000090else:
Brett Cannoncd171c82013-07-04 17:43:24 -040091 raise ImportError('no os specific module found')
Guido van Rossume65cce51993-11-08 15:05:21 +000092
Skip Montanaro117910d2003-02-14 19:35:31 +000093sys.modules['os.path'] = path
Georg Brandled5b9b32008-12-05 07:45:54 +000094from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep,
95 devnull)
Skip Montanaro269b83b2001-02-06 01:07:02 +000096
Guido van Rossuma28dab51997-08-29 22:36:47 +000097del _names
98
Larry Hastings9cf065c2012-06-22 16:30:09 -070099
100if _exists("_have_functions"):
101 _globals = globals()
102 def _add(str, fn):
103 if (fn in _globals) and (str in _have_functions):
104 _set.add(_globals[fn])
105
106 _set = set()
107 _add("HAVE_FACCESSAT", "access")
108 _add("HAVE_FCHMODAT", "chmod")
109 _add("HAVE_FCHOWNAT", "chown")
110 _add("HAVE_FSTATAT", "stat")
111 _add("HAVE_FUTIMESAT", "utime")
112 _add("HAVE_LINKAT", "link")
113 _add("HAVE_MKDIRAT", "mkdir")
114 _add("HAVE_MKFIFOAT", "mkfifo")
115 _add("HAVE_MKNODAT", "mknod")
116 _add("HAVE_OPENAT", "open")
117 _add("HAVE_READLINKAT", "readlink")
118 _add("HAVE_RENAMEAT", "rename")
119 _add("HAVE_SYMLINKAT", "symlink")
120 _add("HAVE_UNLINKAT", "unlink")
Larry Hastingsb698d8e2012-06-23 16:55:07 -0700121 _add("HAVE_UNLINKAT", "rmdir")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700122 _add("HAVE_UTIMENSAT", "utime")
123 supports_dir_fd = _set
124
125 _set = set()
126 _add("HAVE_FACCESSAT", "access")
127 supports_effective_ids = _set
128
129 _set = set()
130 _add("HAVE_FCHDIR", "chdir")
131 _add("HAVE_FCHMOD", "chmod")
132 _add("HAVE_FCHOWN", "chown")
133 _add("HAVE_FDOPENDIR", "listdir")
Serhiy Storchakaea720fe2017-03-30 09:12:31 +0300134 _add("HAVE_FDOPENDIR", "scandir")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700135 _add("HAVE_FEXECVE", "execve")
136 _set.add(stat) # fstat always works
Georg Brandl306336b2012-06-24 12:55:33 +0200137 _add("HAVE_FTRUNCATE", "truncate")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700138 _add("HAVE_FUTIMENS", "utime")
139 _add("HAVE_FUTIMES", "utime")
Georg Brandl306336b2012-06-24 12:55:33 +0200140 _add("HAVE_FPATHCONF", "pathconf")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700141 if _exists("statvfs") and _exists("fstatvfs"): # mac os x10.3
142 _add("HAVE_FSTATVFS", "statvfs")
143 supports_fd = _set
144
145 _set = set()
146 _add("HAVE_FACCESSAT", "access")
Larry Hastingsdbbc0c82012-06-22 19:50:21 -0700147 # Some platforms don't support lchmod(). Often the function exists
148 # anyway, as a stub that always returns ENOSUP or perhaps EOPNOTSUPP.
149 # (No, I don't know why that's a good design.) ./configure will detect
150 # this and reject it--so HAVE_LCHMOD still won't be defined on such
151 # platforms. This is Very Helpful.
152 #
153 # However, sometimes platforms without a working lchmod() *do* have
154 # fchmodat(). (Examples: Linux kernel 3.2 with glibc 2.15,
155 # OpenIndiana 3.x.) And fchmodat() has a flag that theoretically makes
156 # it behave like lchmod(). So in theory it would be a suitable
157 # replacement for lchmod(). But when lchmod() doesn't work, fchmodat()'s
158 # flag doesn't work *either*. Sadly ./configure isn't sophisticated
159 # enough to detect this condition--it only determines whether or not
160 # fchmodat() minimally works.
161 #
162 # Therefore we simply ignore fchmodat() when deciding whether or not
163 # os.chmod supports follow_symlinks. Just checking lchmod() is
164 # sufficient. After all--if you have a working fchmodat(), your
165 # lchmod() almost certainly works too.
166 #
167 # _add("HAVE_FCHMODAT", "chmod")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700168 _add("HAVE_FCHOWNAT", "chown")
169 _add("HAVE_FSTATAT", "stat")
170 _add("HAVE_LCHFLAGS", "chflags")
171 _add("HAVE_LCHMOD", "chmod")
172 if _exists("lchown"): # mac os x10.3
173 _add("HAVE_LCHOWN", "chown")
174 _add("HAVE_LINKAT", "link")
175 _add("HAVE_LUTIMES", "utime")
176 _add("HAVE_LSTAT", "stat")
177 _add("HAVE_FSTATAT", "stat")
178 _add("HAVE_UTIMENSAT", "utime")
179 _add("MS_WINDOWS", "stat")
180 supports_follow_symlinks = _set
181
Larry Hastings9cf065c2012-06-22 16:30:09 -0700182 del _set
183 del _have_functions
184 del _globals
185 del _add
186
187
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000188# Python uses fixed values for the SEEK_ constants; they are mapped
189# to native constants if necessary in posixmodule.c
Jesus Cea94363612012-06-22 18:32:07 +0200190# Other possible SEEK values are directly imported from posixmodule.c
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000191SEEK_SET = 0
192SEEK_CUR = 1
193SEEK_END = 2
194
Guido van Rossum4def7de1998-07-24 20:48:03 +0000195# Super directory utilities.
196# (Inspired by Eric Raymond; the doc strings are mostly his)
197
Terry Reedy5a22b652010-12-02 07:05:56 +0000198def makedirs(name, mode=0o777, exist_ok=False):
Zachary Warea22ae212014-03-20 09:42:01 -0500199 """makedirs(name [, mode=0o777][, exist_ok=False])
Guido van Rossum4def7de1998-07-24 20:48:03 +0000200
Benjamin Petersonee5f1c12014-04-01 19:13:18 -0400201 Super-mkdir; create a leaf directory and all intermediate ones. Works like
202 mkdir, except that any intermediate path segment (not just the rightmost)
203 will be created if it does not exist. If the target directory already
204 exists, raise an OSError if exist_ok is False. Otherwise no exception is
Terry Reedy5a22b652010-12-02 07:05:56 +0000205 raised. This is recursive.
Guido van Rossum4def7de1998-07-24 20:48:03 +0000206
207 """
208 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000209 if not tail:
210 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000211 if head and tail and not path.exists(head):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000212 try:
Serhiy Storchakae304e332017-03-24 13:27:42 +0200213 makedirs(head, exist_ok=exist_ok)
Giampaolo Rodola'0166a282013-02-12 15:14:17 +0100214 except FileExistsError:
Martin Pantera82642f2015-11-19 04:48:44 +0000215 # Defeats race condition when another thread created the path
Giampaolo Rodola'0166a282013-02-12 15:14:17 +0100216 pass
Serhiy Storchaka4ab23bf2013-01-08 11:32:58 +0200217 cdir = curdir
218 if isinstance(tail, bytes):
219 cdir = bytes(curdir, 'ASCII')
220 if tail == cdir: # xxx/newdir/. exists if xxx/newdir exists
Andrew M. Kuchling6fccc8a2003-12-23 16:33:28 +0000221 return
Terry Reedy5a22b652010-12-02 07:05:56 +0000222 try:
223 mkdir(name, mode)
Martin Pantera82642f2015-11-19 04:48:44 +0000224 except OSError:
225 # Cannot rely on checking for EEXIST, since the operating system
226 # could give priority to other errors like EACCES or EROFS
227 if not exist_ok or not path.isdir(name):
Terry Reedy5a22b652010-12-02 07:05:56 +0000228 raise
Guido van Rossum4def7de1998-07-24 20:48:03 +0000229
230def removedirs(name):
Zachary Warea22ae212014-03-20 09:42:01 -0500231 """removedirs(name)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000232
Fredrik Lundh96c1c7a2005-11-12 15:55:04 +0000233 Super-rmdir; remove a leaf directory and all empty intermediate
Guido van Rossum4def7de1998-07-24 20:48:03 +0000234 ones. Works like rmdir except that, if the leaf directory is
235 successfully removed, directories corresponding to rightmost path
Tim Petersc4e09402003-04-25 07:11:48 +0000236 segments will be pruned away until either the whole path is
Guido van Rossum4def7de1998-07-24 20:48:03 +0000237 consumed or an error occurs. Errors during this latter phase are
238 ignored -- they generally mean that a directory was not empty.
239
240 """
241 rmdir(name)
242 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000243 if not tail:
244 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000245 while head and tail:
246 try:
247 rmdir(head)
Andrew Svetlov2552bc02012-12-24 21:47:24 +0200248 except OSError:
Guido van Rossum4def7de1998-07-24 20:48:03 +0000249 break
250 head, tail = path.split(head)
251
252def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000253 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000254
255 Super-rename; create directories as necessary and delete any left
256 empty. Works like rename, except creation of any intermediate
257 directories needed to make the new pathname good is attempted
258 first. After the rename, directories corresponding to rightmost
Benjamin Peterson52a3b742015-04-13 20:24:10 -0400259 path segments of the old name will be pruned until either the
Guido van Rossum4def7de1998-07-24 20:48:03 +0000260 whole path is consumed or a nonempty directory is found.
261
262 Note: this function can fail with the new directory structure made
263 if you lack permissions needed to unlink the leaf directory or
264 file.
265
266 """
267 head, tail = path.split(new)
268 if head and tail and not path.exists(head):
269 makedirs(head)
270 rename(old, new)
271 head, tail = path.split(old)
272 if head and tail:
273 try:
274 removedirs(head)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200275 except OSError:
Guido van Rossum4def7de1998-07-24 20:48:03 +0000276 pass
277
Skip Montanaro269b83b2001-02-06 01:07:02 +0000278__all__.extend(["makedirs", "removedirs", "renames"])
279
Guido van Rossumd8faa362007-04-27 19:54:29 +0000280def walk(top, topdown=True, onerror=None, followlinks=False):
Tim Petersc4e09402003-04-25 07:11:48 +0000281 """Directory tree generator.
282
283 For each directory in the directory tree rooted at top (including top
284 itself, but excluding '.' and '..'), yields a 3-tuple
285
286 dirpath, dirnames, filenames
287
288 dirpath is a string, the path to the directory. dirnames is a list of
289 the names of the subdirectories in dirpath (excluding '.' and '..').
290 filenames is a list of the names of the non-directory files in dirpath.
291 Note that the names in the lists are just names, with no path components.
292 To get a full path (which begins with top) to a file or directory in
293 dirpath, do os.path.join(dirpath, name).
294
295 If optional arg 'topdown' is true or not specified, the triple for a
296 directory is generated before the triples for any of its subdirectories
297 (directories are generated top down). If topdown is false, the triple
298 for a directory is generated after the triples for all of its
299 subdirectories (directories are generated bottom up).
300
301 When topdown is true, the caller can modify the dirnames list in-place
302 (e.g., via del or slice assignment), and walk will only recurse into the
Benjamin Petersone58e0c72014-06-15 20:51:12 -0700303 subdirectories whose names remain in dirnames; this can be used to prune the
304 search, or to impose a specific order of visiting. Modifying dirnames when
Bernt Røskar Brenna734f1202019-09-10 14:43:58 +0200305 topdown is false has no effect on the behavior of os.walk(), since the
306 directories in dirnames have already been generated by the time dirnames
307 itself is generated. No matter the value of topdown, the list of
308 subdirectories is retrieved before the tuples for the directory and its
309 subdirectories are generated.
Tim Petersc4e09402003-04-25 07:11:48 +0000310
Victor Stinner524a5ba2015-03-10 13:20:34 +0100311 By default errors from the os.scandir() call are ignored. If
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000312 optional arg 'onerror' is specified, it should be a function; it
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200313 will be called with one argument, an OSError instance. It can
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000314 report the error to continue with the walk, or raise the exception
315 to abort the walk. Note that the filename is available as the
316 filename attribute of the exception object.
317
Guido van Rossumd8faa362007-04-27 19:54:29 +0000318 By default, os.walk does not follow symbolic links to subdirectories on
319 systems that support them. In order to get this functionality, set the
320 optional argument 'followlinks' to true.
321
Tim Petersc4e09402003-04-25 07:11:48 +0000322 Caution: if you pass a relative pathname for top, don't change the
323 current working directory between resumptions of walk. walk never
324 changes the current directory, and assumes that the client doesn't
325 either.
326
327 Example:
328
Christian Heimes5d8da202008-05-06 13:58:24 +0000329 import os
Tim Petersc4e09402003-04-25 07:11:48 +0000330 from os.path import join, getsize
Christian Heimes5d8da202008-05-06 13:58:24 +0000331 for root, dirs, files in os.walk('python/Lib/email'):
Neal Norwitz752abd02008-05-13 04:55:24 +0000332 print(root, "consumes", end="")
Recursing3ce3dea2018-12-23 04:48:14 +0100333 print(sum(getsize(join(root, name)) for name in files), end="")
Neal Norwitz752abd02008-05-13 04:55:24 +0000334 print("bytes in", len(files), "non-directory files")
Tim Petersc4e09402003-04-25 07:11:48 +0000335 if 'CVS' in dirs:
336 dirs.remove('CVS') # don't visit CVS directories
Benjamin Petersone58e0c72014-06-15 20:51:12 -0700337
Tim Petersc4e09402003-04-25 07:11:48 +0000338 """
Serhiy Storchakaf4f445b2020-02-12 12:11:34 +0200339 sys.audit("os.walk", top, topdown, onerror, followlinks)
340 return _walk(fspath(top), topdown, onerror, followlinks)
341
342def _walk(top, topdown, onerror, followlinks):
Victor Stinner524a5ba2015-03-10 13:20:34 +0100343 dirs = []
344 nondirs = []
Serhiy Storchaka7c90a822016-02-11 13:31:00 +0200345 walk_dirs = []
Tim Petersc4e09402003-04-25 07:11:48 +0000346
347 # We may not have read permission for top, in which case we can't
Alexandre Vassalotti4e6531e2008-05-09 20:00:17 +0000348 # get a list of the files the directory contains. os.walk
Tim Petersc4e09402003-04-25 07:11:48 +0000349 # always suppressed the exception then, rather than blow up for a
350 # minor reason when (say) a thousand readable directories are still
351 # left to visit. That logic is copied here.
352 try:
Serhiy Storchaka3ae41552016-10-05 23:17:10 +0300353 # Note that scandir is global in this module due
354 # to earlier import-*.
355 scandir_it = scandir(top)
Victor Stinner7fea9742015-03-18 11:29:47 +0100356 except OSError as error:
357 if onerror is not None:
358 onerror(error)
359 return
360
Serhiy Storchakaffe96ae2016-02-11 13:21:30 +0200361 with scandir_it:
362 while True:
Victor Stinner524a5ba2015-03-10 13:20:34 +0100363 try:
Victor Stinner524a5ba2015-03-10 13:20:34 +0100364 try:
Serhiy Storchakaffe96ae2016-02-11 13:21:30 +0200365 entry = next(scandir_it)
366 except StopIteration:
367 break
368 except OSError as error:
369 if onerror is not None:
370 onerror(error)
371 return
Victor Stinner7fea9742015-03-18 11:29:47 +0100372
Serhiy Storchakaffe96ae2016-02-11 13:21:30 +0200373 try:
374 is_dir = entry.is_dir()
375 except OSError:
376 # If is_dir() raises an OSError, consider that the entry is not
377 # a directory, same behaviour than os.path.isdir().
378 is_dir = False
379
380 if is_dir:
381 dirs.append(entry.name)
382 else:
383 nondirs.append(entry.name)
384
385 if not topdown and is_dir:
386 # Bottom-up: recurse into sub-directory, but exclude symlinks to
387 # directories if followlinks is False
388 if followlinks:
389 walk_into = True
390 else:
391 try:
392 is_symlink = entry.is_symlink()
393 except OSError:
394 # If is_symlink() raises an OSError, consider that the
395 # entry is not a symbolic link, same behaviour than
396 # os.path.islink().
397 is_symlink = False
398 walk_into = not is_symlink
399
400 if walk_into:
Serhiy Storchaka7c90a822016-02-11 13:31:00 +0200401 walk_dirs.append(entry.path)
Tim Petersc4e09402003-04-25 07:11:48 +0000402
Victor Stinner524a5ba2015-03-10 13:20:34 +0100403 # Yield before recursion if going top down
Tim Petersc4e09402003-04-25 07:11:48 +0000404 if topdown:
405 yield top, dirs, nondirs
Victor Stinner524a5ba2015-03-10 13:20:34 +0100406
Victor Stinner7fea9742015-03-18 11:29:47 +0100407 # Recurse into sub-directories
408 islink, join = path.islink, path.join
Serhiy Storchaka5f6a0b42016-02-08 16:23:28 +0200409 for dirname in dirs:
410 new_path = join(top, dirname)
Victor Stinner7fea9742015-03-18 11:29:47 +0100411 # Issue #23605: os.path.islink() is used instead of caching
412 # entry.is_symlink() result during the loop on os.scandir() because
413 # the caller can replace the directory entry during the "yield"
414 # above.
415 if followlinks or not islink(new_path):
Serhiy Storchakaf4f445b2020-02-12 12:11:34 +0200416 yield from _walk(new_path, topdown, onerror, followlinks)
Victor Stinner7fea9742015-03-18 11:29:47 +0100417 else:
Serhiy Storchaka7c90a822016-02-11 13:31:00 +0200418 # Recurse into sub-directories
419 for new_path in walk_dirs:
Serhiy Storchakaf4f445b2020-02-12 12:11:34 +0200420 yield from _walk(new_path, topdown, onerror, followlinks)
Victor Stinner7fea9742015-03-18 11:29:47 +0100421 # Yield after recursion if going bottom up
Tim Petersc4e09402003-04-25 07:11:48 +0000422 yield top, dirs, nondirs
423
424__all__.append("walk")
425
Serhiy Storchakaea720fe2017-03-30 09:12:31 +0300426if {open, stat} <= supports_dir_fd and {scandir, stat} <= supports_fd:
Charles-François Natali7372b062012-02-05 15:15:38 +0100427
Larry Hastingsb4038062012-07-15 10:57:38 -0700428 def fwalk(top=".", topdown=True, onerror=None, *, follow_symlinks=False, dir_fd=None):
Charles-François Natali7372b062012-02-05 15:15:38 +0100429 """Directory tree generator.
430
431 This behaves exactly like walk(), except that it yields a 4-tuple
432
433 dirpath, dirnames, filenames, dirfd
434
435 `dirpath`, `dirnames` and `filenames` are identical to walk() output,
436 and `dirfd` is a file descriptor referring to the directory `dirpath`.
437
Larry Hastingsc48fe982012-06-25 04:49:05 -0700438 The advantage of fwalk() over walk() is that it's safe against symlink
Larry Hastingsb4038062012-07-15 10:57:38 -0700439 races (when follow_symlinks is False).
Charles-François Natali7372b062012-02-05 15:15:38 +0100440
Larry Hastingsc48fe982012-06-25 04:49:05 -0700441 If dir_fd is not None, it should be a file descriptor open to a directory,
442 and top should be relative; top will then be relative to that directory.
443 (dir_fd is always supported for fwalk.)
444
Charles-François Natali7372b062012-02-05 15:15:38 +0100445 Caution:
446 Since fwalk() yields file descriptors, those are only valid until the
447 next iteration step, so you should dup() them if you want to keep them
448 for a longer period.
449
450 Example:
451
452 import os
453 for root, dirs, files, rootfd in os.fwalk('python/Lib/email'):
454 print(root, "consumes", end="")
Recursing3ce3dea2018-12-23 04:48:14 +0100455 print(sum(os.stat(name, dir_fd=rootfd).st_size for name in files),
Charles-François Natali7372b062012-02-05 15:15:38 +0100456 end="")
457 print("bytes in", len(files), "non-directory files")
458 if 'CVS' in dirs:
459 dirs.remove('CVS') # don't visit CVS directories
460 """
Serhiy Storchakaf4f445b2020-02-12 12:11:34 +0200461 sys.audit("os.fwalk", top, topdown, onerror, follow_symlinks, dir_fd)
Brett Cannon3f9183b2016-08-26 14:44:48 -0700462 if not isinstance(top, int) or not hasattr(top, '__index__'):
463 top = fspath(top)
Charles-François Natali7372b062012-02-05 15:15:38 +0100464 # Note: To guard against symlink races, we use the standard
465 # lstat()/open()/fstat() trick.
Serhiy Storchakaea720fe2017-03-30 09:12:31 +0300466 if not follow_symlinks:
467 orig_st = stat(top, follow_symlinks=False, dir_fd=dir_fd)
Larry Hastingsc48fe982012-06-25 04:49:05 -0700468 topfd = open(top, O_RDONLY, dir_fd=dir_fd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100469 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700470 if (follow_symlinks or (st.S_ISDIR(orig_st.st_mode) and
471 path.samestat(orig_st, stat(topfd)))):
Serhiy Storchaka8f6b3442017-03-07 14:33:21 +0200472 yield from _fwalk(topfd, top, isinstance(top, bytes),
473 topdown, onerror, follow_symlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100474 finally:
475 close(topfd)
476
Serhiy Storchaka8f6b3442017-03-07 14:33:21 +0200477 def _fwalk(topfd, toppath, isbytes, topdown, onerror, follow_symlinks):
Charles-François Natali7372b062012-02-05 15:15:38 +0100478 # Note: This uses O(depth of the directory tree) file descriptors: if
479 # necessary, it can be adapted to only require O(1) FDs, see issue
480 # #13734.
481
Serhiy Storchakaea720fe2017-03-30 09:12:31 +0300482 scandir_it = scandir(topfd)
483 dirs = []
484 nondirs = []
485 entries = None if topdown or follow_symlinks else []
486 for entry in scandir_it:
487 name = entry.name
488 if isbytes:
489 name = fsencode(name)
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200490 try:
Serhiy Storchakaea720fe2017-03-30 09:12:31 +0300491 if entry.is_dir():
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200492 dirs.append(name)
Serhiy Storchakaea720fe2017-03-30 09:12:31 +0300493 if entries is not None:
494 entries.append(entry)
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200495 else:
496 nondirs.append(name)
Serhiy Storchaka42babab2016-10-25 14:28:38 +0300497 except OSError:
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200498 try:
499 # Add dangling symlinks, ignore disappeared files
Serhiy Storchakaea720fe2017-03-30 09:12:31 +0300500 if entry.is_symlink():
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200501 nondirs.append(name)
Serhiy Storchaka42babab2016-10-25 14:28:38 +0300502 except OSError:
Serhiy Storchakaea720fe2017-03-30 09:12:31 +0300503 pass
Charles-François Natali7372b062012-02-05 15:15:38 +0100504
505 if topdown:
506 yield toppath, dirs, nondirs, topfd
507
Serhiy Storchakaea720fe2017-03-30 09:12:31 +0300508 for name in dirs if entries is None else zip(dirs, entries):
Charles-François Natali7372b062012-02-05 15:15:38 +0100509 try:
Serhiy Storchakaea720fe2017-03-30 09:12:31 +0300510 if not follow_symlinks:
511 if topdown:
512 orig_st = stat(name, dir_fd=topfd, follow_symlinks=False)
513 else:
514 assert entries is not None
515 name, entry = name
516 orig_st = entry.stat(follow_symlinks=False)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700517 dirfd = open(name, O_RDONLY, dir_fd=topfd)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200518 except OSError as err:
Charles-François Natali7372b062012-02-05 15:15:38 +0100519 if onerror is not None:
520 onerror(err)
Serhiy Storchaka0bddc9e2015-12-23 00:08:24 +0200521 continue
Charles-François Natali7372b062012-02-05 15:15:38 +0100522 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700523 if follow_symlinks or path.samestat(orig_st, stat(dirfd)):
Charles-François Natali7372b062012-02-05 15:15:38 +0100524 dirpath = path.join(toppath, name)
Serhiy Storchaka8f6b3442017-03-07 14:33:21 +0200525 yield from _fwalk(dirfd, dirpath, isbytes,
526 topdown, onerror, follow_symlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100527 finally:
528 close(dirfd)
529
530 if not topdown:
531 yield toppath, dirs, nondirs, topfd
532
533 __all__.append("fwalk")
534
Guido van Rossume65cce51993-11-08 15:05:21 +0000535def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000536 """execl(file, *args)
537
538 Execute the executable file with argument list args, replacing the
539 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000540 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000541
542def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000543 """execle(file, *args, env)
544
545 Execute the executable file with argument list args and
546 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000547 env = args[-1]
548 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000549
550def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000551 """execlp(file, *args)
552
553 Execute the executable file (which is searched for along $PATH)
554 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000555 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000556
Guido van Rossum030afb11995-03-14 17:27:18 +0000557def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000558 """execlpe(file, *args, env)
559
560 Execute the executable file (which is searched for along $PATH)
561 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000562 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000563 env = args[-1]
564 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000565
Guido van Rossume65cce51993-11-08 15:05:21 +0000566def execvp(file, args):
Matthias Klosea09c54f2010-01-31 16:48:44 +0000567 """execvp(file, args)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000568
569 Execute the executable file (which is searched for along $PATH)
570 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000571 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000572 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000573
574def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000575 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000576
577 Execute the executable file (which is searched for along $PATH)
Hasan Ramezanifb6807b2019-09-09 17:58:21 +0200578 with argument list args and environment env, replacing the
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000579 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000580 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000581 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000582
Skip Montanaro269b83b2001-02-06 01:07:02 +0000583__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
584
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000585def _execvpe(file, args, env=None):
586 if env is not None:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000587 exec_func = execve
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000588 argrest = (args, env)
589 else:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000590 exec_func = execv
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000591 argrest = (args,)
592 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000593
Serhiy Storchaka81108372017-09-26 00:55:55 +0300594 if path.dirname(file):
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000595 exec_func(file, *argrest)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000596 return
Serhiy Storchaka81108372017-09-26 00:55:55 +0300597 saved_exc = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000598 path_list = get_exec_path(env)
599 if name != 'nt':
600 file = fsencode(file)
601 path_list = map(fsencode, path_list)
602 for dir in path_list:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000603 fullname = path.join(dir, file)
604 try:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000605 exec_func(fullname, *argrest)
Serhiy Storchaka81108372017-09-26 00:55:55 +0300606 except (FileNotFoundError, NotADirectoryError) as e:
607 last_exc = e
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200608 except OSError as e:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000609 last_exc = e
Serhiy Storchaka81108372017-09-26 00:55:55 +0300610 if saved_exc is None:
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000611 saved_exc = e
Serhiy Storchaka81108372017-09-26 00:55:55 +0300612 if saved_exc is not None:
613 raise saved_exc
614 raise last_exc
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000615
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000616
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000617def get_exec_path(env=None):
618 """Returns the sequence of directories that will be searched for the
619 named executable (similar to a shell) when launching a process.
620
621 *env* must be an environment variable dict or None. If *env* is None,
622 os.environ will be used.
623 """
Victor Stinner273b7662010-11-06 12:59:33 +0000624 # Use a local import instead of a global import to limit the number of
625 # modules loaded at startup: the os module is always loaded at startup by
626 # Python. It may also avoid a bootstrap issue.
Victor Stinner6f35eda2010-10-29 00:38:58 +0000627 import warnings
628
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000629 if env is None:
630 env = environ
Victor Stinnerb745a742010-05-18 17:17:23 +0000631
Victor Stinnerbb4f2182010-11-07 15:43:39 +0000632 # {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a
633 # BytesWarning when using python -b or python -bb: ignore the warning
Victor Stinner273b7662010-11-06 12:59:33 +0000634 with warnings.catch_warnings():
635 warnings.simplefilter("ignore", BytesWarning)
Victor Stinnerb745a742010-05-18 17:17:23 +0000636
Victor Stinnerb745a742010-05-18 17:17:23 +0000637 try:
Victor Stinner273b7662010-11-06 12:59:33 +0000638 path_list = env.get('PATH')
639 except TypeError:
640 path_list = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000641
Victor Stinner273b7662010-11-06 12:59:33 +0000642 if supports_bytes_environ:
643 try:
644 path_listb = env[b'PATH']
645 except (KeyError, TypeError):
646 pass
647 else:
648 if path_list is not None:
649 raise ValueError(
650 "env cannot contain 'PATH' and b'PATH' keys")
651 path_list = path_listb
652
653 if path_list is not None and isinstance(path_list, bytes):
654 path_list = fsdecode(path_list)
Victor Stinnerb745a742010-05-18 17:17:23 +0000655
656 if path_list is None:
657 path_list = defpath
658 return path_list.split(pathsep)
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000659
660
Victor Stinnerb8d12622020-01-24 14:05:48 +0100661# Change environ to automatically call putenv() and unsetenv()
Charles Burklandd648ef12020-03-13 09:04:43 -0700662from _collections_abc import MutableMapping, Mapping
Skip Montanaro289bc052007-08-17 02:30:27 +0000663
664class _Environ(MutableMapping):
Victor Stinnerb8d12622020-01-24 14:05:48 +0100665 def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue):
Victor Stinner84ae1182010-05-06 22:05:07 +0000666 self.encodekey = encodekey
667 self.decodekey = decodekey
668 self.encodevalue = encodevalue
669 self.decodevalue = decodevalue
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000670 self._data = data
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000671
Skip Montanaro289bc052007-08-17 02:30:27 +0000672 def __getitem__(self, key):
Victor Stinner6d101392013-04-14 16:35:04 +0200673 try:
674 value = self._data[self.encodekey(key)]
675 except KeyError:
676 # raise KeyError with the original key value
Victor Stinner0c2dd0c2013-08-23 19:19:15 +0200677 raise KeyError(key) from None
Victor Stinner84ae1182010-05-06 22:05:07 +0000678 return self.decodevalue(value)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000679
Skip Montanaro289bc052007-08-17 02:30:27 +0000680 def __setitem__(self, key, value):
Victor Stinner84ae1182010-05-06 22:05:07 +0000681 key = self.encodekey(key)
682 value = self.encodevalue(value)
Victor Stinnerb8d12622020-01-24 14:05:48 +0100683 putenv(key, value)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000684 self._data[key] = value
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000685
Skip Montanaro289bc052007-08-17 02:30:27 +0000686 def __delitem__(self, key):
Victor Stinner6d101392013-04-14 16:35:04 +0200687 encodedkey = self.encodekey(key)
Victor Stinnerb8d12622020-01-24 14:05:48 +0100688 unsetenv(encodedkey)
Victor Stinner6d101392013-04-14 16:35:04 +0200689 try:
690 del self._data[encodedkey]
691 except KeyError:
692 # raise KeyError with the original key value
Victor Stinner0c2dd0c2013-08-23 19:19:15 +0200693 raise KeyError(key) from None
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000694
Skip Montanaro289bc052007-08-17 02:30:27 +0000695 def __iter__(self):
Osvaldo Santana Neto8a8d2852017-07-01 14:34:45 -0300696 # list() from dict object is an atomic operation
697 keys = list(self._data)
698 for key in keys:
Victor Stinner84ae1182010-05-06 22:05:07 +0000699 yield self.decodekey(key)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000700
Skip Montanaro289bc052007-08-17 02:30:27 +0000701 def __len__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000702 return len(self._data)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000703
704 def __repr__(self):
Victor Stinnerbed71172010-07-28 21:25:42 +0000705 return 'environ({{{}}})'.format(', '.join(
Victor Stinnerd73c1a32010-07-28 21:23:23 +0000706 ('{!r}: {!r}'.format(self.decodekey(key), self.decodevalue(value))
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000707 for key, value in self._data.items())))
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000708
Skip Montanaro289bc052007-08-17 02:30:27 +0000709 def copy(self):
710 return dict(self)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000711
Skip Montanaro289bc052007-08-17 02:30:27 +0000712 def setdefault(self, key, value):
713 if key not in self:
714 self[key] = value
715 return self[key]
716
Charles Burklandd648ef12020-03-13 09:04:43 -0700717 def __ior__(self, other):
718 self.update(other)
719 return self
720
721 def __or__(self, other):
722 if not isinstance(other, Mapping):
723 return NotImplemented
724 new = dict(self)
725 new.update(other)
726 return new
727
728 def __ror__(self, other):
729 if not isinstance(other, Mapping):
730 return NotImplemented
731 new = dict(other)
732 new.update(self)
733 return new
734
Victor Stinner84ae1182010-05-06 22:05:07 +0000735def _createenviron():
Jesus Cea4791a242012-10-05 03:15:39 +0200736 if name == 'nt':
Victor Stinner84ae1182010-05-06 22:05:07 +0000737 # Where Env Var Names Must Be UPPERCASE
738 def check_str(value):
739 if not isinstance(value, str):
740 raise TypeError("str expected, not %s" % type(value).__name__)
741 return value
742 encode = check_str
743 decode = str
744 def encodekey(key):
745 return encode(key).upper()
746 data = {}
747 for key, value in environ.items():
748 data[encodekey(key)] = value
749 else:
750 # Where Env Var Names Can Be Mixed Case
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000751 encoding = sys.getfilesystemencoding()
Victor Stinner84ae1182010-05-06 22:05:07 +0000752 def encode(value):
753 if not isinstance(value, str):
754 raise TypeError("str expected, not %s" % type(value).__name__)
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000755 return value.encode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000756 def decode(value):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000757 return value.decode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000758 encodekey = encode
759 data = environ
760 return _Environ(data,
761 encodekey, decode,
Victor Stinnerb8d12622020-01-24 14:05:48 +0100762 encode, decode)
Guido van Rossumc524d952001-10-19 01:31:59 +0000763
Victor Stinner84ae1182010-05-06 22:05:07 +0000764# unicode environ
765environ = _createenviron()
766del _createenviron
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000767
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000768
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000769def getenv(key, default=None):
Tim Peters2c60f7a2003-01-29 03:49:43 +0000770 """Get an environment variable, return None if it doesn't exist.
Victor Stinner84ae1182010-05-06 22:05:07 +0000771 The optional second argument can specify an alternate default.
772 key, default and the result are str."""
Tim Peters2c60f7a2003-01-29 03:49:43 +0000773 return environ.get(key, default)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000774
Jesus Cea4791a242012-10-05 03:15:39 +0200775supports_bytes_environ = (name != 'nt')
Victor Stinnerb745a742010-05-18 17:17:23 +0000776__all__.extend(("getenv", "supports_bytes_environ"))
777
778if supports_bytes_environ:
Victor Stinner84ae1182010-05-06 22:05:07 +0000779 def _check_bytes(value):
780 if not isinstance(value, bytes):
781 raise TypeError("bytes expected, not %s" % type(value).__name__)
782 return value
783
784 # bytes environ
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000785 environb = _Environ(environ._data,
Victor Stinner84ae1182010-05-06 22:05:07 +0000786 _check_bytes, bytes,
Victor Stinnerb8d12622020-01-24 14:05:48 +0100787 _check_bytes, bytes)
Victor Stinner84ae1182010-05-06 22:05:07 +0000788 del _check_bytes
789
790 def getenvb(key, default=None):
791 """Get an environment variable, return None if it doesn't exist.
792 The optional second argument can specify an alternate default.
793 key, default and the result are bytes."""
794 return environb.get(key, default)
Victor Stinner70120e22010-07-29 17:19:38 +0000795
796 __all__.extend(("environb", "getenvb"))
Victor Stinner84ae1182010-05-06 22:05:07 +0000797
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000798def _fscodec():
799 encoding = sys.getfilesystemencoding()
Steve Dowercc16be82016-09-08 10:35:16 -0700800 errors = sys.getfilesystemencodeerrors()
Victor Stinnere8d51452010-08-19 01:05:19 +0000801
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000802 def fsencode(filename):
Brett Cannon5f74ebc2016-06-09 14:29:25 -0700803 """Encode filename (an os.PathLike, bytes, or str) to the filesystem
Ethan Furmanc1cbeed2016-06-04 10:19:27 -0700804 encoding with 'surrogateescape' error handler, return bytes unchanged.
805 On Windows, use 'strict' error handler if the file system encoding is
806 'mbcs' (which is the default encoding).
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000807 """
Brett Cannonc78ca1e2016-06-24 12:03:43 -0700808 filename = fspath(filename) # Does type-checking of `filename`.
809 if isinstance(filename, str):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000810 return filename.encode(encoding, errors)
Victor Stinnere8d51452010-08-19 01:05:19 +0000811 else:
Brett Cannonc78ca1e2016-06-24 12:03:43 -0700812 return filename
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000813
814 def fsdecode(filename):
Brett Cannon5f74ebc2016-06-09 14:29:25 -0700815 """Decode filename (an os.PathLike, bytes, or str) from the filesystem
Ethan Furmanc1cbeed2016-06-04 10:19:27 -0700816 encoding with 'surrogateescape' error handler, return str unchanged. On
817 Windows, use 'strict' error handler if the file system encoding is
818 'mbcs' (which is the default encoding).
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000819 """
Brett Cannonc78ca1e2016-06-24 12:03:43 -0700820 filename = fspath(filename) # Does type-checking of `filename`.
821 if isinstance(filename, bytes):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000822 return filename.decode(encoding, errors)
823 else:
Brett Cannonc78ca1e2016-06-24 12:03:43 -0700824 return filename
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000825
826 return fsencode, fsdecode
827
828fsencode, fsdecode = _fscodec()
829del _fscodec
Victor Stinner449c4662010-05-08 11:10:09 +0000830
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000831# Supply spawn*() (probably only for Unix)
832if _exists("fork") and not _exists("spawnv") and _exists("execv"):
833
834 P_WAIT = 0
835 P_NOWAIT = P_NOWAITO = 1
836
Petri Lehtinen3bc37f22012-05-23 21:36:16 +0300837 __all__.extend(["P_WAIT", "P_NOWAIT", "P_NOWAITO"])
838
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000839 # XXX Should we support P_DETACH? I suppose it could fork()**2
840 # and close the std I/O streams. Also, P_OVERLAY is the same
841 # as execv*()?
842
843 def _spawnvef(mode, file, args, env, func):
844 # Internal helper; func is the exec*() function to use
Steve Dowereccaa062016-11-19 20:11:56 -0800845 if not isinstance(args, (tuple, list)):
846 raise TypeError('argv must be a tuple or a list')
Steve Dowerbb08db42016-11-19 21:14:27 -0800847 if not args or not args[0]:
Steve Dowereccaa062016-11-19 20:11:56 -0800848 raise ValueError('argv first element cannot be empty')
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000849 pid = fork()
850 if not pid:
851 # Child
852 try:
853 if env is None:
854 func(file, args)
855 else:
856 func(file, args, env)
857 except:
858 _exit(127)
859 else:
860 # Parent
861 if mode == P_NOWAIT:
862 return pid # Caller is responsible for waiting!
863 while 1:
864 wpid, sts = waitpid(pid, 0)
865 if WIFSTOPPED(sts):
866 continue
Victor Stinner65a796e2020-04-01 18:49:29 +0200867
868 return waitstatus_to_exitcode(sts)
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):
Bar Hareleae87e32019-12-22 11:57:27 +02001073 if cls is PathLike:
1074 return _check_methods(subclass, '__fspath__')
1075 return NotImplemented
Steve Dower2438cdf2019-03-29 16:37:16 -07001076
Batuhan Taşkaya526606b2019-12-08 23:31:15 +03001077 def __class_getitem__(cls, type):
1078 return cls
1079
Steve Dower2438cdf2019-03-29 16:37:16 -07001080
1081if name == 'nt':
1082 class _AddedDllDirectory:
1083 def __init__(self, path, cookie, remove_dll_directory):
1084 self.path = path
1085 self._cookie = cookie
1086 self._remove_dll_directory = remove_dll_directory
1087 def close(self):
1088 self._remove_dll_directory(self._cookie)
1089 self.path = None
1090 def __enter__(self):
1091 return self
1092 def __exit__(self, *args):
1093 self.close()
1094 def __repr__(self):
1095 if self.path:
1096 return "<AddedDllDirectory({!r})>".format(self.path)
1097 return "<AddedDllDirectory()>"
1098
1099 def add_dll_directory(path):
1100 """Add a path to the DLL search path.
1101
1102 This search path is used when resolving dependencies for imported
1103 extension modules (the module itself is resolved through sys.path),
1104 and also by ctypes.
1105
1106 Remove the directory by calling close() on the returned object or
1107 using it in a with statement.
1108 """
1109 import nt
1110 cookie = nt._add_dll_directory(path)
1111 return _AddedDllDirectory(
1112 path,
1113 cookie,
1114 nt._remove_dll_directory
1115 )