blob: 7379dad41ac52f1006bab6f30939d6a4cb097aa0 [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'
Guido van Rossum54f22ed2000-02-04 15:10:34 +00007 - os.curdir is a string representing the current directory ('.' or ':')
8 - os.pardir is a string representing the parent directory ('..' or '::')
9 - os.sep is the (or a most common) pathname separator ('/' or ':' or '\\')
Georg Brandled5b9b32008-12-05 07:45:54 +000010 - os.extsep is the extension separator (always '.')
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +000011 - os.altsep is the alternate pathname separator (None or '/')
Guido van Rossum54f22ed2000-02-04 15:10:34 +000012 - os.pathsep is the component separator used in $PATH etc
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +000013 - os.linesep is the line separator in text files ('\r' or '\n' or '\r\n')
Guido van Rossum54f22ed2000-02-04 15:10:34 +000014 - os.defpath is the default search path for executables
Martin v. Löwisbdec50f2004-06-08 08:29:33 +000015 - os.devnull is the file path of the null device ('/dev/null', etc.)
Guido van Rossum31104f41992-01-14 18:28:36 +000016
Guido van Rossum54f22ed2000-02-04 15:10:34 +000017Programs that import and use 'os' stand a better chance of being
18portable between different platforms. Of course, they must then
19only use functions that are defined by all platforms (e.g., unlink
20and opendir), and leave all pathname manipulation to os.path
21(e.g., split and join).
22"""
Guido van Rossum31104f41992-01-14 18:28:36 +000023
Skip Montanaro269b83b2001-02-06 01:07:02 +000024#'
Ethan Furman958b3e42016-06-04 12:49:35 -070025import abc
Christian Heimes45f9af32007-11-27 21:50:00 +000026import sys, errno
Charles-François Natali7372b062012-02-05 15:15:38 +010027import stat as st
Guido van Rossuma28dab51997-08-29 22:36:47 +000028
29_names = sys.builtin_module_names
30
Tim Petersc4e09402003-04-25 07:11:48 +000031# Note: more names are added to __all__ later.
Brett Cannon13962fc2008-08-18 01:45:29 +000032__all__ = ["altsep", "curdir", "pardir", "sep", "pathsep", "linesep",
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030033 "defpath", "name", "path", "devnull", "SEEK_SET", "SEEK_CUR",
34 "SEEK_END", "fsencode", "fsdecode", "get_exec_path", "fdopen",
35 "popen", "extsep"]
Skip Montanaro269b83b2001-02-06 01:07:02 +000036
Charles-François Natali7372b062012-02-05 15:15:38 +010037def _exists(name):
38 return name in globals()
39
Skip Montanaro269b83b2001-02-06 01:07:02 +000040def _get_exports_list(module):
41 try:
42 return list(module.__all__)
43 except AttributeError:
44 return [n for n in dir(module) if n[0] != '_']
45
Brett Cannonfd074152012-04-14 14:10:13 -040046# Any new dependencies of the os module and/or changes in path separator
47# requires updating importlib as well.
Guido van Rossuma28dab51997-08-29 22:36:47 +000048if 'posix' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000049 name = 'posix'
Guido van Rossume9387ea1998-05-22 15:26:04 +000050 linesep = '\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000051 from posix import *
52 try:
53 from posix import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030054 __all__.append('_exit')
Brett Cannoncd171c82013-07-04 17:43:24 -040055 except ImportError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000056 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000057 import posixpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000058
Larry Hastings9cf065c2012-06-22 16:30:09 -070059 try:
60 from posix import _have_functions
Brett Cannoncd171c82013-07-04 17:43:24 -040061 except ImportError:
Larry Hastings9cf065c2012-06-22 16:30:09 -070062 pass
Skip Montanaro269b83b2001-02-06 01:07:02 +000063
Yury Selivanov97e2e062014-09-26 12:33:06 -040064 import posix
65 __all__.extend(_get_exports_list(posix))
66 del posix
67
Guido van Rossuma28dab51997-08-29 22:36:47 +000068elif 'nt' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000069 name = 'nt'
Guido van Rossume9387ea1998-05-22 15:26:04 +000070 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000071 from nt import *
Tim Peters6757c1e2003-01-08 21:20:57 +000072 try:
73 from nt import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030074 __all__.append('_exit')
Brett Cannoncd171c82013-07-04 17:43:24 -040075 except ImportError:
Tim Peters6757c1e2003-01-08 21:20:57 +000076 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000077 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000078
Skip Montanaro269b83b2001-02-06 01:07:02 +000079 import nt
80 __all__.extend(_get_exports_list(nt))
81 del nt
82
Larry Hastings9cf065c2012-06-22 16:30:09 -070083 try:
84 from nt import _have_functions
Brett Cannoncd171c82013-07-04 17:43:24 -040085 except ImportError:
Larry Hastings9cf065c2012-06-22 16:30:09 -070086 pass
87
Guido van 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")
132 _add("HAVE_FEXECVE", "execve")
133 _set.add(stat) # fstat always works
Georg Brandl306336b2012-06-24 12:55:33 +0200134 _add("HAVE_FTRUNCATE", "truncate")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700135 _add("HAVE_FUTIMENS", "utime")
136 _add("HAVE_FUTIMES", "utime")
Georg Brandl306336b2012-06-24 12:55:33 +0200137 _add("HAVE_FPATHCONF", "pathconf")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700138 if _exists("statvfs") and _exists("fstatvfs"): # mac os x10.3
139 _add("HAVE_FSTATVFS", "statvfs")
140 supports_fd = _set
141
142 _set = set()
143 _add("HAVE_FACCESSAT", "access")
Larry Hastingsdbbc0c82012-06-22 19:50:21 -0700144 # Some platforms don't support lchmod(). Often the function exists
145 # anyway, as a stub that always returns ENOSUP or perhaps EOPNOTSUPP.
146 # (No, I don't know why that's a good design.) ./configure will detect
147 # this and reject it--so HAVE_LCHMOD still won't be defined on such
148 # platforms. This is Very Helpful.
149 #
150 # However, sometimes platforms without a working lchmod() *do* have
151 # fchmodat(). (Examples: Linux kernel 3.2 with glibc 2.15,
152 # OpenIndiana 3.x.) And fchmodat() has a flag that theoretically makes
153 # it behave like lchmod(). So in theory it would be a suitable
154 # replacement for lchmod(). But when lchmod() doesn't work, fchmodat()'s
155 # flag doesn't work *either*. Sadly ./configure isn't sophisticated
156 # enough to detect this condition--it only determines whether or not
157 # fchmodat() minimally works.
158 #
159 # Therefore we simply ignore fchmodat() when deciding whether or not
160 # os.chmod supports follow_symlinks. Just checking lchmod() is
161 # sufficient. After all--if you have a working fchmodat(), your
162 # lchmod() almost certainly works too.
163 #
164 # _add("HAVE_FCHMODAT", "chmod")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700165 _add("HAVE_FCHOWNAT", "chown")
166 _add("HAVE_FSTATAT", "stat")
167 _add("HAVE_LCHFLAGS", "chflags")
168 _add("HAVE_LCHMOD", "chmod")
169 if _exists("lchown"): # mac os x10.3
170 _add("HAVE_LCHOWN", "chown")
171 _add("HAVE_LINKAT", "link")
172 _add("HAVE_LUTIMES", "utime")
173 _add("HAVE_LSTAT", "stat")
174 _add("HAVE_FSTATAT", "stat")
175 _add("HAVE_UTIMENSAT", "utime")
176 _add("MS_WINDOWS", "stat")
177 supports_follow_symlinks = _set
178
Larry Hastings9cf065c2012-06-22 16:30:09 -0700179 del _set
180 del _have_functions
181 del _globals
182 del _add
183
184
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000185# Python uses fixed values for the SEEK_ constants; they are mapped
186# to native constants if necessary in posixmodule.c
Jesus Cea94363612012-06-22 18:32:07 +0200187# Other possible SEEK values are directly imported from posixmodule.c
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000188SEEK_SET = 0
189SEEK_CUR = 1
190SEEK_END = 2
191
Guido van Rossum4def7de1998-07-24 20:48:03 +0000192# Super directory utilities.
193# (Inspired by Eric Raymond; the doc strings are mostly his)
194
Terry Reedy5a22b652010-12-02 07:05:56 +0000195def makedirs(name, mode=0o777, exist_ok=False):
Zachary Warea22ae212014-03-20 09:42:01 -0500196 """makedirs(name [, mode=0o777][, exist_ok=False])
Guido van Rossum4def7de1998-07-24 20:48:03 +0000197
Benjamin Petersonee5f1c12014-04-01 19:13:18 -0400198 Super-mkdir; create a leaf directory and all intermediate ones. Works like
199 mkdir, except that any intermediate path segment (not just the rightmost)
200 will be created if it does not exist. If the target directory already
201 exists, raise an OSError if exist_ok is False. Otherwise no exception is
Terry Reedy5a22b652010-12-02 07:05:56 +0000202 raised. This is recursive.
Guido van Rossum4def7de1998-07-24 20:48:03 +0000203
204 """
205 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000206 if not tail:
207 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000208 if head and tail and not path.exists(head):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000209 try:
Terry Reedy5a22b652010-12-02 07:05:56 +0000210 makedirs(head, mode, exist_ok)
Giampaolo Rodola'0166a282013-02-12 15:14:17 +0100211 except FileExistsError:
Martin Pantera82642f2015-11-19 04:48:44 +0000212 # Defeats race condition when another thread created the path
Giampaolo Rodola'0166a282013-02-12 15:14:17 +0100213 pass
Serhiy Storchaka4ab23bf2013-01-08 11:32:58 +0200214 cdir = curdir
215 if isinstance(tail, bytes):
216 cdir = bytes(curdir, 'ASCII')
217 if tail == cdir: # xxx/newdir/. exists if xxx/newdir exists
Andrew M. Kuchling6fccc8a2003-12-23 16:33:28 +0000218 return
Terry Reedy5a22b652010-12-02 07:05:56 +0000219 try:
220 mkdir(name, mode)
Martin Pantera82642f2015-11-19 04:48:44 +0000221 except OSError:
222 # Cannot rely on checking for EEXIST, since the operating system
223 # could give priority to other errors like EACCES or EROFS
224 if not exist_ok or not path.isdir(name):
Terry Reedy5a22b652010-12-02 07:05:56 +0000225 raise
Guido van Rossum4def7de1998-07-24 20:48:03 +0000226
227def removedirs(name):
Zachary Warea22ae212014-03-20 09:42:01 -0500228 """removedirs(name)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000229
Fredrik Lundh96c1c7a2005-11-12 15:55:04 +0000230 Super-rmdir; remove a leaf directory and all empty intermediate
Guido van Rossum4def7de1998-07-24 20:48:03 +0000231 ones. Works like rmdir except that, if the leaf directory is
232 successfully removed, directories corresponding to rightmost path
Tim Petersc4e09402003-04-25 07:11:48 +0000233 segments will be pruned away until either the whole path is
Guido van Rossum4def7de1998-07-24 20:48:03 +0000234 consumed or an error occurs. Errors during this latter phase are
235 ignored -- they generally mean that a directory was not empty.
236
237 """
238 rmdir(name)
239 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000240 if not tail:
241 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000242 while head and tail:
243 try:
244 rmdir(head)
Andrew Svetlov2552bc02012-12-24 21:47:24 +0200245 except OSError:
Guido van Rossum4def7de1998-07-24 20:48:03 +0000246 break
247 head, tail = path.split(head)
248
249def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000250 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000251
252 Super-rename; create directories as necessary and delete any left
253 empty. Works like rename, except creation of any intermediate
254 directories needed to make the new pathname good is attempted
255 first. After the rename, directories corresponding to rightmost
Benjamin Peterson52a3b742015-04-13 20:24:10 -0400256 path segments of the old name will be pruned until either the
Guido van Rossum4def7de1998-07-24 20:48:03 +0000257 whole path is consumed or a nonempty directory is found.
258
259 Note: this function can fail with the new directory structure made
260 if you lack permissions needed to unlink the leaf directory or
261 file.
262
263 """
264 head, tail = path.split(new)
265 if head and tail and not path.exists(head):
266 makedirs(head)
267 rename(old, new)
268 head, tail = path.split(old)
269 if head and tail:
270 try:
271 removedirs(head)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200272 except OSError:
Guido van Rossum4def7de1998-07-24 20:48:03 +0000273 pass
274
Skip Montanaro269b83b2001-02-06 01:07:02 +0000275__all__.extend(["makedirs", "removedirs", "renames"])
276
Guido van Rossumd8faa362007-04-27 19:54:29 +0000277def walk(top, topdown=True, onerror=None, followlinks=False):
Tim Petersc4e09402003-04-25 07:11:48 +0000278 """Directory tree generator.
279
280 For each directory in the directory tree rooted at top (including top
281 itself, but excluding '.' and '..'), yields a 3-tuple
282
283 dirpath, dirnames, filenames
284
285 dirpath is a string, the path to the directory. dirnames is a list of
286 the names of the subdirectories in dirpath (excluding '.' and '..').
287 filenames is a list of the names of the non-directory files in dirpath.
288 Note that the names in the lists are just names, with no path components.
289 To get a full path (which begins with top) to a file or directory in
290 dirpath, do os.path.join(dirpath, name).
291
292 If optional arg 'topdown' is true or not specified, the triple for a
293 directory is generated before the triples for any of its subdirectories
294 (directories are generated top down). If topdown is false, the triple
295 for a directory is generated after the triples for all of its
296 subdirectories (directories are generated bottom up).
297
298 When topdown is true, the caller can modify the dirnames list in-place
299 (e.g., via del or slice assignment), and walk will only recurse into the
Benjamin Petersone58e0c72014-06-15 20:51:12 -0700300 subdirectories whose names remain in dirnames; this can be used to prune the
301 search, or to impose a specific order of visiting. Modifying dirnames when
302 topdown is false is ineffective, since the directories in dirnames have
303 already been generated by the time dirnames itself is generated. No matter
304 the value of topdown, the list of subdirectories is retrieved before the
305 tuples for the directory and its subdirectories are generated.
Tim Petersc4e09402003-04-25 07:11:48 +0000306
Victor Stinner524a5ba2015-03-10 13:20:34 +0100307 By default errors from the os.scandir() call are ignored. If
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000308 optional arg 'onerror' is specified, it should be a function; it
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200309 will be called with one argument, an OSError instance. It can
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000310 report the error to continue with the walk, or raise the exception
311 to abort the walk. Note that the filename is available as the
312 filename attribute of the exception object.
313
Guido van Rossumd8faa362007-04-27 19:54:29 +0000314 By default, os.walk does not follow symbolic links to subdirectories on
315 systems that support them. In order to get this functionality, set the
316 optional argument 'followlinks' to true.
317
Tim Petersc4e09402003-04-25 07:11:48 +0000318 Caution: if you pass a relative pathname for top, don't change the
319 current working directory between resumptions of walk. walk never
320 changes the current directory, and assumes that the client doesn't
321 either.
322
323 Example:
324
Christian Heimes5d8da202008-05-06 13:58:24 +0000325 import os
Tim Petersc4e09402003-04-25 07:11:48 +0000326 from os.path import join, getsize
Christian Heimes5d8da202008-05-06 13:58:24 +0000327 for root, dirs, files in os.walk('python/Lib/email'):
Neal Norwitz752abd02008-05-13 04:55:24 +0000328 print(root, "consumes", end="")
329 print(sum([getsize(join(root, name)) for name in files]), end="")
330 print("bytes in", len(files), "non-directory files")
Tim Petersc4e09402003-04-25 07:11:48 +0000331 if 'CVS' in dirs:
332 dirs.remove('CVS') # don't visit CVS directories
Benjamin Petersone58e0c72014-06-15 20:51:12 -0700333
Tim Petersc4e09402003-04-25 07:11:48 +0000334 """
Brett Cannon3f9183b2016-08-26 14:44:48 -0700335 top = fspath(top)
Victor Stinner524a5ba2015-03-10 13:20:34 +0100336 dirs = []
337 nondirs = []
Serhiy Storchaka7c90a822016-02-11 13:31:00 +0200338 walk_dirs = []
Tim Petersc4e09402003-04-25 07:11:48 +0000339
340 # We may not have read permission for top, in which case we can't
Alexandre Vassalotti4e6531e2008-05-09 20:00:17 +0000341 # get a list of the files the directory contains. os.walk
Tim Petersc4e09402003-04-25 07:11:48 +0000342 # always suppressed the exception then, rather than blow up for a
343 # minor reason when (say) a thousand readable directories are still
344 # left to visit. That logic is copied here.
345 try:
Serhiy Storchaka5f6a0b42016-02-08 16:23:28 +0200346 if name == 'nt' and isinstance(top, bytes):
347 scandir_it = _dummy_scandir(top)
348 else:
349 # Note that scandir is global in this module due
350 # to earlier import-*.
351 scandir_it = scandir(top)
Victor Stinner7fea9742015-03-18 11:29:47 +0100352 except OSError as error:
353 if onerror is not None:
354 onerror(error)
355 return
356
Serhiy Storchakaffe96ae2016-02-11 13:21:30 +0200357 with scandir_it:
358 while True:
Victor Stinner524a5ba2015-03-10 13:20:34 +0100359 try:
Victor Stinner524a5ba2015-03-10 13:20:34 +0100360 try:
Serhiy Storchakaffe96ae2016-02-11 13:21:30 +0200361 entry = next(scandir_it)
362 except StopIteration:
363 break
364 except OSError as error:
365 if onerror is not None:
366 onerror(error)
367 return
Victor Stinner7fea9742015-03-18 11:29:47 +0100368
Serhiy Storchakaffe96ae2016-02-11 13:21:30 +0200369 try:
370 is_dir = entry.is_dir()
371 except OSError:
372 # If is_dir() raises an OSError, consider that the entry is not
373 # a directory, same behaviour than os.path.isdir().
374 is_dir = False
375
376 if is_dir:
377 dirs.append(entry.name)
378 else:
379 nondirs.append(entry.name)
380
381 if not topdown and is_dir:
382 # Bottom-up: recurse into sub-directory, but exclude symlinks to
383 # directories if followlinks is False
384 if followlinks:
385 walk_into = True
386 else:
387 try:
388 is_symlink = entry.is_symlink()
389 except OSError:
390 # If is_symlink() raises an OSError, consider that the
391 # entry is not a symbolic link, same behaviour than
392 # os.path.islink().
393 is_symlink = False
394 walk_into = not is_symlink
395
396 if walk_into:
Serhiy Storchaka7c90a822016-02-11 13:31:00 +0200397 walk_dirs.append(entry.path)
Tim Petersc4e09402003-04-25 07:11:48 +0000398
Victor Stinner524a5ba2015-03-10 13:20:34 +0100399 # Yield before recursion if going top down
Tim Petersc4e09402003-04-25 07:11:48 +0000400 if topdown:
401 yield top, dirs, nondirs
Victor Stinner524a5ba2015-03-10 13:20:34 +0100402
Victor Stinner7fea9742015-03-18 11:29:47 +0100403 # Recurse into sub-directories
404 islink, join = path.islink, path.join
Serhiy Storchaka5f6a0b42016-02-08 16:23:28 +0200405 for dirname in dirs:
406 new_path = join(top, dirname)
Victor Stinner7fea9742015-03-18 11:29:47 +0100407 # Issue #23605: os.path.islink() is used instead of caching
408 # entry.is_symlink() result during the loop on os.scandir() because
409 # the caller can replace the directory entry during the "yield"
410 # above.
411 if followlinks or not islink(new_path):
412 yield from walk(new_path, topdown, onerror, followlinks)
413 else:
Serhiy Storchaka7c90a822016-02-11 13:31:00 +0200414 # Recurse into sub-directories
415 for new_path in walk_dirs:
416 yield from walk(new_path, topdown, onerror, followlinks)
Victor Stinner7fea9742015-03-18 11:29:47 +0100417 # Yield after recursion if going bottom up
Tim Petersc4e09402003-04-25 07:11:48 +0000418 yield top, dirs, nondirs
419
Serhiy Storchaka5f6a0b42016-02-08 16:23:28 +0200420class _DummyDirEntry:
Victor Stinnerba8b0a72016-03-24 12:23:18 +0100421 """Dummy implementation of DirEntry
422
423 Only used internally by os.walk(bytes). Since os.walk() doesn't need the
424 follow_symlinks parameter: don't implement it, always follow symbolic
425 links.
426 """
427
Serhiy Storchaka5f6a0b42016-02-08 16:23:28 +0200428 def __init__(self, dir, name):
429 self.name = name
430 self.path = path.join(dir, name)
Victor Stinnerba8b0a72016-03-24 12:23:18 +0100431 # Mimick FindFirstFile/FindNextFile: we should get file attributes
432 # while iterating on a directory
433 self._stat = None
Victor Stinner73030df2016-03-29 11:25:00 +0200434 self._lstat = None
Victor Stinnerba8b0a72016-03-24 12:23:18 +0100435 try:
Victor Stinner73030df2016-03-29 11:25:00 +0200436 self.stat(follow_symlinks=False)
Victor Stinnerba8b0a72016-03-24 12:23:18 +0100437 except OSError:
438 pass
439
Victor Stinner73030df2016-03-29 11:25:00 +0200440 def stat(self, *, follow_symlinks=True):
441 if follow_symlinks:
442 if self._stat is None:
443 self._stat = stat(self.path)
444 return self._stat
445 else:
446 if self._lstat is None:
447 self._lstat = stat(self.path, follow_symlinks=False)
448 return self._lstat
Serhiy Storchakaffe96ae2016-02-11 13:21:30 +0200449
Serhiy Storchaka5f6a0b42016-02-08 16:23:28 +0200450 def is_dir(self):
Victor Stinner73030df2016-03-29 11:25:00 +0200451 if self._lstat is not None and not self.is_symlink():
452 # use the cache lstat
453 stat = self.stat(follow_symlinks=False)
454 return st.S_ISDIR(stat.st_mode)
455
Victor Stinnerba8b0a72016-03-24 12:23:18 +0100456 stat = self.stat()
457 return st.S_ISDIR(stat.st_mode)
Serhiy Storchakaffe96ae2016-02-11 13:21:30 +0200458
Serhiy Storchaka5f6a0b42016-02-08 16:23:28 +0200459 def is_symlink(self):
Victor Stinner73030df2016-03-29 11:25:00 +0200460 stat = self.stat(follow_symlinks=False)
Victor Stinnerba8b0a72016-03-24 12:23:18 +0100461 return st.S_ISLNK(stat.st_mode)
Serhiy Storchaka5f6a0b42016-02-08 16:23:28 +0200462
Serhiy Storchakaffe96ae2016-02-11 13:21:30 +0200463class _dummy_scandir:
Serhiy Storchaka5f6a0b42016-02-08 16:23:28 +0200464 # listdir-based implementation for bytes patches on Windows
Serhiy Storchakaffe96ae2016-02-11 13:21:30 +0200465 def __init__(self, dir):
466 self.dir = dir
467 self.it = iter(listdir(dir))
468
469 def __iter__(self):
470 return self
471
472 def __next__(self):
473 return _DummyDirEntry(self.dir, next(self.it))
474
475 def __enter__(self):
476 return self
477
478 def __exit__(self, *args):
479 self.it = iter(())
Serhiy Storchaka5f6a0b42016-02-08 16:23:28 +0200480
Tim Petersc4e09402003-04-25 07:11:48 +0000481__all__.append("walk")
482
Larry Hastingsc48fe982012-06-25 04:49:05 -0700483if {open, stat} <= supports_dir_fd and {listdir, stat} <= supports_fd:
Charles-François Natali7372b062012-02-05 15:15:38 +0100484
Larry Hastingsb4038062012-07-15 10:57:38 -0700485 def fwalk(top=".", topdown=True, onerror=None, *, follow_symlinks=False, dir_fd=None):
Charles-François Natali7372b062012-02-05 15:15:38 +0100486 """Directory tree generator.
487
488 This behaves exactly like walk(), except that it yields a 4-tuple
489
490 dirpath, dirnames, filenames, dirfd
491
492 `dirpath`, `dirnames` and `filenames` are identical to walk() output,
493 and `dirfd` is a file descriptor referring to the directory `dirpath`.
494
Larry Hastingsc48fe982012-06-25 04:49:05 -0700495 The advantage of fwalk() over walk() is that it's safe against symlink
Larry Hastingsb4038062012-07-15 10:57:38 -0700496 races (when follow_symlinks is False).
Charles-François Natali7372b062012-02-05 15:15:38 +0100497
Larry Hastingsc48fe982012-06-25 04:49:05 -0700498 If dir_fd is not None, it should be a file descriptor open to a directory,
499 and top should be relative; top will then be relative to that directory.
500 (dir_fd is always supported for fwalk.)
501
Charles-François Natali7372b062012-02-05 15:15:38 +0100502 Caution:
503 Since fwalk() yields file descriptors, those are only valid until the
504 next iteration step, so you should dup() them if you want to keep them
505 for a longer period.
506
507 Example:
508
509 import os
510 for root, dirs, files, rootfd in os.fwalk('python/Lib/email'):
511 print(root, "consumes", end="")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700512 print(sum([os.stat(name, dir_fd=rootfd).st_size for name in files]),
Charles-François Natali7372b062012-02-05 15:15:38 +0100513 end="")
514 print("bytes in", len(files), "non-directory files")
515 if 'CVS' in dirs:
516 dirs.remove('CVS') # don't visit CVS directories
517 """
Brett Cannon3f9183b2016-08-26 14:44:48 -0700518 if not isinstance(top, int) or not hasattr(top, '__index__'):
519 top = fspath(top)
Charles-François Natali7372b062012-02-05 15:15:38 +0100520 # Note: To guard against symlink races, we use the standard
521 # lstat()/open()/fstat() trick.
Larry Hastingsc48fe982012-06-25 04:49:05 -0700522 orig_st = stat(top, follow_symlinks=False, dir_fd=dir_fd)
523 topfd = open(top, O_RDONLY, dir_fd=dir_fd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100524 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700525 if (follow_symlinks or (st.S_ISDIR(orig_st.st_mode) and
526 path.samestat(orig_st, stat(topfd)))):
527 yield from _fwalk(topfd, top, topdown, onerror, follow_symlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100528 finally:
529 close(topfd)
530
Larry Hastingsb4038062012-07-15 10:57:38 -0700531 def _fwalk(topfd, toppath, topdown, onerror, follow_symlinks):
Charles-François Natali7372b062012-02-05 15:15:38 +0100532 # Note: This uses O(depth of the directory tree) file descriptors: if
533 # necessary, it can be adapted to only require O(1) FDs, see issue
534 # #13734.
535
Larry Hastings9cf065c2012-06-22 16:30:09 -0700536 names = listdir(topfd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100537 dirs, nondirs = [], []
538 for name in names:
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200539 try:
540 # Here, we don't use AT_SYMLINK_NOFOLLOW to be consistent with
541 # walk() which reports symlinks to directories as directories.
542 # We do however check for symlinks before recursing into
543 # a subdirectory.
Larry Hastings9cf065c2012-06-22 16:30:09 -0700544 if st.S_ISDIR(stat(name, dir_fd=topfd).st_mode):
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200545 dirs.append(name)
546 else:
547 nondirs.append(name)
548 except FileNotFoundError:
549 try:
550 # Add dangling symlinks, ignore disappeared files
Larry Hastings9cf065c2012-06-22 16:30:09 -0700551 if st.S_ISLNK(stat(name, dir_fd=topfd, follow_symlinks=False)
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200552 .st_mode):
553 nondirs.append(name)
554 except FileNotFoundError:
555 continue
Charles-François Natali7372b062012-02-05 15:15:38 +0100556
557 if topdown:
558 yield toppath, dirs, nondirs, topfd
559
560 for name in dirs:
561 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700562 orig_st = stat(name, dir_fd=topfd, follow_symlinks=follow_symlinks)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700563 dirfd = open(name, O_RDONLY, dir_fd=topfd)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200564 except OSError as err:
Charles-François Natali7372b062012-02-05 15:15:38 +0100565 if onerror is not None:
566 onerror(err)
Serhiy Storchaka0bddc9e2015-12-23 00:08:24 +0200567 continue
Charles-François Natali7372b062012-02-05 15:15:38 +0100568 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700569 if follow_symlinks or path.samestat(orig_st, stat(dirfd)):
Charles-François Natali7372b062012-02-05 15:15:38 +0100570 dirpath = path.join(toppath, name)
Larry Hastingsb4038062012-07-15 10:57:38 -0700571 yield from _fwalk(dirfd, dirpath, topdown, onerror, follow_symlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100572 finally:
573 close(dirfd)
574
575 if not topdown:
576 yield toppath, dirs, nondirs, topfd
577
578 __all__.append("fwalk")
579
Guido van Rossuma28dab51997-08-29 22:36:47 +0000580# Make sure os.environ exists, at least
581try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000582 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000583except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000584 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000585
Guido van Rossume65cce51993-11-08 15:05:21 +0000586def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000587 """execl(file, *args)
588
589 Execute the executable file with argument list args, replacing the
590 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000591 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000592
593def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000594 """execle(file, *args, env)
595
596 Execute the executable file with argument list args and
597 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000598 env = args[-1]
599 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000600
601def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000602 """execlp(file, *args)
603
604 Execute the executable file (which is searched for along $PATH)
605 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000606 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000607
Guido van Rossum030afb11995-03-14 17:27:18 +0000608def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000609 """execlpe(file, *args, env)
610
611 Execute the executable file (which is searched for along $PATH)
612 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000613 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000614 env = args[-1]
615 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000616
Guido van Rossume65cce51993-11-08 15:05:21 +0000617def execvp(file, args):
Matthias Klosea09c54f2010-01-31 16:48:44 +0000618 """execvp(file, args)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000619
620 Execute the executable file (which is searched for along $PATH)
621 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000622 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000623 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000624
625def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000626 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000627
628 Execute the executable file (which is searched for along $PATH)
629 with argument list args and environment env , replacing the
630 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000631 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000632 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000633
Skip Montanaro269b83b2001-02-06 01:07:02 +0000634__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
635
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000636def _execvpe(file, args, env=None):
637 if env is not None:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000638 exec_func = execve
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000639 argrest = (args, env)
640 else:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000641 exec_func = execv
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000642 argrest = (args,)
643 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000644
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000645 head, tail = path.split(file)
646 if head:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000647 exec_func(file, *argrest)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000648 return
Guido van Rossume7ba4952007-06-06 23:52:48 +0000649 last_exc = saved_exc = None
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000650 saved_tb = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000651 path_list = get_exec_path(env)
652 if name != 'nt':
653 file = fsencode(file)
654 path_list = map(fsencode, path_list)
655 for dir in path_list:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000656 fullname = path.join(dir, file)
657 try:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000658 exec_func(fullname, *argrest)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200659 except OSError as e:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000660 last_exc = e
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000661 tb = sys.exc_info()[2]
Christian Heimes45f9af32007-11-27 21:50:00 +0000662 if (e.errno != errno.ENOENT and e.errno != errno.ENOTDIR
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000663 and saved_exc is None):
664 saved_exc = e
665 saved_tb = tb
666 if saved_exc:
Benjamin Peterson4b068192009-02-20 03:19:25 +0000667 raise saved_exc.with_traceback(saved_tb)
668 raise last_exc.with_traceback(tb)
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000669
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000670
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000671def get_exec_path(env=None):
672 """Returns the sequence of directories that will be searched for the
673 named executable (similar to a shell) when launching a process.
674
675 *env* must be an environment variable dict or None. If *env* is None,
676 os.environ will be used.
677 """
Victor Stinner273b7662010-11-06 12:59:33 +0000678 # Use a local import instead of a global import to limit the number of
679 # modules loaded at startup: the os module is always loaded at startup by
680 # Python. It may also avoid a bootstrap issue.
Victor Stinner6f35eda2010-10-29 00:38:58 +0000681 import warnings
682
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000683 if env is None:
684 env = environ
Victor Stinnerb745a742010-05-18 17:17:23 +0000685
Victor Stinnerbb4f2182010-11-07 15:43:39 +0000686 # {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a
687 # BytesWarning when using python -b or python -bb: ignore the warning
Victor Stinner273b7662010-11-06 12:59:33 +0000688 with warnings.catch_warnings():
689 warnings.simplefilter("ignore", BytesWarning)
Victor Stinnerb745a742010-05-18 17:17:23 +0000690
Victor Stinnerb745a742010-05-18 17:17:23 +0000691 try:
Victor Stinner273b7662010-11-06 12:59:33 +0000692 path_list = env.get('PATH')
693 except TypeError:
694 path_list = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000695
Victor Stinner273b7662010-11-06 12:59:33 +0000696 if supports_bytes_environ:
697 try:
698 path_listb = env[b'PATH']
699 except (KeyError, TypeError):
700 pass
701 else:
702 if path_list is not None:
703 raise ValueError(
704 "env cannot contain 'PATH' and b'PATH' keys")
705 path_list = path_listb
706
707 if path_list is not None and isinstance(path_list, bytes):
708 path_list = fsdecode(path_list)
Victor Stinnerb745a742010-05-18 17:17:23 +0000709
710 if path_list is None:
711 path_list = defpath
712 return path_list.split(pathsep)
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000713
714
Skip Montanaro289bc052007-08-17 02:30:27 +0000715# Change environ to automatically call putenv(), unsetenv if they exist.
Christian Heimesf1dc3ee2013-10-13 02:04:20 +0200716from _collections_abc import MutableMapping
Skip Montanaro289bc052007-08-17 02:30:27 +0000717
718class _Environ(MutableMapping):
Victor Stinner84ae1182010-05-06 22:05:07 +0000719 def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv):
720 self.encodekey = encodekey
721 self.decodekey = decodekey
722 self.encodevalue = encodevalue
723 self.decodevalue = decodevalue
Skip Montanaro289bc052007-08-17 02:30:27 +0000724 self.putenv = putenv
725 self.unsetenv = unsetenv
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000726 self._data = data
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000727
Skip Montanaro289bc052007-08-17 02:30:27 +0000728 def __getitem__(self, key):
Victor Stinner6d101392013-04-14 16:35:04 +0200729 try:
730 value = self._data[self.encodekey(key)]
731 except KeyError:
732 # raise KeyError with the original key value
Victor Stinner0c2dd0c2013-08-23 19:19:15 +0200733 raise KeyError(key) from None
Victor Stinner84ae1182010-05-06 22:05:07 +0000734 return self.decodevalue(value)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000735
Skip Montanaro289bc052007-08-17 02:30:27 +0000736 def __setitem__(self, key, value):
Victor Stinner84ae1182010-05-06 22:05:07 +0000737 key = self.encodekey(key)
738 value = self.encodevalue(value)
Skip Montanaro289bc052007-08-17 02:30:27 +0000739 self.putenv(key, value)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000740 self._data[key] = value
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000741
Skip Montanaro289bc052007-08-17 02:30:27 +0000742 def __delitem__(self, key):
Victor Stinner6d101392013-04-14 16:35:04 +0200743 encodedkey = self.encodekey(key)
744 self.unsetenv(encodedkey)
745 try:
746 del self._data[encodedkey]
747 except KeyError:
748 # raise KeyError with the original key value
Victor Stinner0c2dd0c2013-08-23 19:19:15 +0200749 raise KeyError(key) from None
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000750
Skip Montanaro289bc052007-08-17 02:30:27 +0000751 def __iter__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000752 for key in self._data:
Victor Stinner84ae1182010-05-06 22:05:07 +0000753 yield self.decodekey(key)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000754
Skip Montanaro289bc052007-08-17 02:30:27 +0000755 def __len__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000756 return len(self._data)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000757
758 def __repr__(self):
Victor Stinnerbed71172010-07-28 21:25:42 +0000759 return 'environ({{{}}})'.format(', '.join(
Victor Stinnerd73c1a32010-07-28 21:23:23 +0000760 ('{!r}: {!r}'.format(self.decodekey(key), self.decodevalue(value))
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000761 for key, value in self._data.items())))
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000762
Skip Montanaro289bc052007-08-17 02:30:27 +0000763 def copy(self):
764 return dict(self)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000765
Skip Montanaro289bc052007-08-17 02:30:27 +0000766 def setdefault(self, key, value):
767 if key not in self:
768 self[key] = value
769 return self[key]
770
771try:
772 _putenv = putenv
773except NameError:
774 _putenv = lambda key, value: None
Richard Oudkerkc41917f2013-05-07 14:36:51 +0100775else:
776 if "putenv" not in __all__:
777 __all__.append("putenv")
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000778
Skip Montanaro289bc052007-08-17 02:30:27 +0000779try:
780 _unsetenv = unsetenv
781except NameError:
782 _unsetenv = lambda key: _putenv(key, "")
Richard Oudkerkc41917f2013-05-07 14:36:51 +0100783else:
784 if "unsetenv" not in __all__:
785 __all__.append("unsetenv")
Guido van Rossumc524d952001-10-19 01:31:59 +0000786
Victor Stinner84ae1182010-05-06 22:05:07 +0000787def _createenviron():
Jesus Cea4791a242012-10-05 03:15:39 +0200788 if name == 'nt':
Victor Stinner84ae1182010-05-06 22:05:07 +0000789 # Where Env Var Names Must Be UPPERCASE
790 def check_str(value):
791 if not isinstance(value, str):
792 raise TypeError("str expected, not %s" % type(value).__name__)
793 return value
794 encode = check_str
795 decode = str
796 def encodekey(key):
797 return encode(key).upper()
798 data = {}
799 for key, value in environ.items():
800 data[encodekey(key)] = value
801 else:
802 # Where Env Var Names Can Be Mixed Case
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000803 encoding = sys.getfilesystemencoding()
Victor Stinner84ae1182010-05-06 22:05:07 +0000804 def encode(value):
805 if not isinstance(value, str):
806 raise TypeError("str expected, not %s" % type(value).__name__)
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000807 return value.encode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000808 def decode(value):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000809 return value.decode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000810 encodekey = encode
811 data = environ
812 return _Environ(data,
813 encodekey, decode,
814 encode, decode,
815 _putenv, _unsetenv)
Guido van Rossumc524d952001-10-19 01:31:59 +0000816
Victor Stinner84ae1182010-05-06 22:05:07 +0000817# unicode environ
818environ = _createenviron()
819del _createenviron
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000820
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000821
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000822def getenv(key, default=None):
Tim Peters2c60f7a2003-01-29 03:49:43 +0000823 """Get an environment variable, return None if it doesn't exist.
Victor Stinner84ae1182010-05-06 22:05:07 +0000824 The optional second argument can specify an alternate default.
825 key, default and the result are str."""
Tim Peters2c60f7a2003-01-29 03:49:43 +0000826 return environ.get(key, default)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000827
Jesus Cea4791a242012-10-05 03:15:39 +0200828supports_bytes_environ = (name != 'nt')
Victor Stinnerb745a742010-05-18 17:17:23 +0000829__all__.extend(("getenv", "supports_bytes_environ"))
830
831if supports_bytes_environ:
Victor Stinner84ae1182010-05-06 22:05:07 +0000832 def _check_bytes(value):
833 if not isinstance(value, bytes):
834 raise TypeError("bytes expected, not %s" % type(value).__name__)
835 return value
836
837 # bytes environ
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000838 environb = _Environ(environ._data,
Victor Stinner84ae1182010-05-06 22:05:07 +0000839 _check_bytes, bytes,
840 _check_bytes, bytes,
841 _putenv, _unsetenv)
842 del _check_bytes
843
844 def getenvb(key, default=None):
845 """Get an environment variable, return None if it doesn't exist.
846 The optional second argument can specify an alternate default.
847 key, default and the result are bytes."""
848 return environb.get(key, default)
Victor Stinner70120e22010-07-29 17:19:38 +0000849
850 __all__.extend(("environb", "getenvb"))
Victor Stinner84ae1182010-05-06 22:05:07 +0000851
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000852def _fscodec():
853 encoding = sys.getfilesystemencoding()
Steve Dowercc16be82016-09-08 10:35:16 -0700854 errors = sys.getfilesystemencodeerrors()
Victor Stinnere8d51452010-08-19 01:05:19 +0000855
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000856 def fsencode(filename):
Brett Cannon5f74ebc2016-06-09 14:29:25 -0700857 """Encode filename (an os.PathLike, bytes, or str) to the filesystem
Ethan Furmanc1cbeed2016-06-04 10:19:27 -0700858 encoding with 'surrogateescape' error handler, return bytes unchanged.
859 On Windows, use 'strict' error handler if the file system encoding is
860 'mbcs' (which is the default encoding).
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000861 """
Brett Cannonc78ca1e2016-06-24 12:03:43 -0700862 filename = fspath(filename) # Does type-checking of `filename`.
863 if isinstance(filename, str):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000864 return filename.encode(encoding, errors)
Victor Stinnere8d51452010-08-19 01:05:19 +0000865 else:
Brett Cannonc78ca1e2016-06-24 12:03:43 -0700866 return filename
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000867
868 def fsdecode(filename):
Brett Cannon5f74ebc2016-06-09 14:29:25 -0700869 """Decode filename (an os.PathLike, bytes, or str) from the filesystem
Ethan Furmanc1cbeed2016-06-04 10:19:27 -0700870 encoding with 'surrogateescape' error handler, return str unchanged. On
871 Windows, use 'strict' error handler if the file system encoding is
872 'mbcs' (which is the default encoding).
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000873 """
Brett Cannonc78ca1e2016-06-24 12:03:43 -0700874 filename = fspath(filename) # Does type-checking of `filename`.
875 if isinstance(filename, bytes):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000876 return filename.decode(encoding, errors)
877 else:
Brett Cannonc78ca1e2016-06-24 12:03:43 -0700878 return filename
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000879
880 return fsencode, fsdecode
881
882fsencode, fsdecode = _fscodec()
883del _fscodec
Victor Stinner449c4662010-05-08 11:10:09 +0000884
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000885# Supply spawn*() (probably only for Unix)
886if _exists("fork") and not _exists("spawnv") and _exists("execv"):
887
888 P_WAIT = 0
889 P_NOWAIT = P_NOWAITO = 1
890
Petri Lehtinen3bc37f22012-05-23 21:36:16 +0300891 __all__.extend(["P_WAIT", "P_NOWAIT", "P_NOWAITO"])
892
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000893 # XXX Should we support P_DETACH? I suppose it could fork()**2
894 # and close the std I/O streams. Also, P_OVERLAY is the same
895 # as execv*()?
896
897 def _spawnvef(mode, file, args, env, func):
898 # Internal helper; func is the exec*() function to use
899 pid = fork()
900 if not pid:
901 # Child
902 try:
903 if env is None:
904 func(file, args)
905 else:
906 func(file, args, env)
907 except:
908 _exit(127)
909 else:
910 # Parent
911 if mode == P_NOWAIT:
912 return pid # Caller is responsible for waiting!
913 while 1:
914 wpid, sts = waitpid(pid, 0)
915 if WIFSTOPPED(sts):
916 continue
917 elif WIFSIGNALED(sts):
918 return -WTERMSIG(sts)
919 elif WIFEXITED(sts):
920 return WEXITSTATUS(sts)
921 else:
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200922 raise OSError("Not stopped, signaled or exited???")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000923
924 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000925 """spawnv(mode, file, args) -> integer
926
927Execute file with arguments from args in a subprocess.
928If mode == P_NOWAIT return the pid of the process.
929If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000930otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000931 return _spawnvef(mode, file, args, None, execv)
932
933 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000934 """spawnve(mode, file, args, env) -> integer
935
936Execute file with arguments from args in a subprocess with the
937specified environment.
938If mode == P_NOWAIT return the pid of the process.
939If mode == P_WAIT return the process's exit code if it exits normally;
940otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000941 return _spawnvef(mode, file, args, env, execve)
942
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000943 # Note: spawnvp[e] is't currently supported on Windows
944
945 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000946 """spawnvp(mode, file, args) -> integer
947
948Execute file (which is looked for along $PATH) with arguments from
949args in a subprocess.
950If mode == P_NOWAIT return the pid of the process.
951If mode == P_WAIT return the process's exit code if it exits normally;
952otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000953 return _spawnvef(mode, file, args, None, execvp)
954
955 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000956 """spawnvpe(mode, file, args, env) -> integer
957
958Execute file (which is looked for along $PATH) with arguments from
959args in a subprocess with the supplied environment.
960If mode == P_NOWAIT return the pid of the process.
961If mode == P_WAIT return the process's exit code if it exits normally;
962otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000963 return _spawnvef(mode, file, args, env, execvpe)
964
Richard Oudkerkad34ef82013-05-07 14:23:42 +0100965
966 __all__.extend(["spawnv", "spawnve", "spawnvp", "spawnvpe"])
967
968
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000969if _exists("spawnv"):
970 # These aren't supplied by the basic Windows code
971 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000972
973 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000974 """spawnl(mode, file, *args) -> integer
975
976Execute file with arguments from args in a subprocess.
977If mode == P_NOWAIT return the pid of the process.
978If mode == P_WAIT return the process's exit code if it exits normally;
979otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000980 return spawnv(mode, file, args)
981
982 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000983 """spawnle(mode, file, *args, env) -> integer
984
985Execute file with arguments from args in a subprocess with the
986supplied environment.
987If mode == P_NOWAIT return the pid of the process.
988If mode == P_WAIT return the process's exit code if it exits normally;
989otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000990 env = args[-1]
991 return spawnve(mode, file, args[:-1], env)
992
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000993
Richard Oudkerkad34ef82013-05-07 14:23:42 +0100994 __all__.extend(["spawnl", "spawnle"])
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000995
996
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000997if _exists("spawnvp"):
998 # At the moment, Windows doesn't implement spawnvp[e],
999 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +00001000 def spawnlp(mode, file, *args):
Neal Norwitzb7f68102003-07-02 02:49:33 +00001001 """spawnlp(mode, file, *args) -> integer
Guido van Rossume0cd2912000-04-21 18:35:36 +00001002
1003Execute file (which is looked for along $PATH) with arguments from
1004args in a subprocess with the supplied environment.
1005If mode == P_NOWAIT return the pid of the process.
1006If mode == P_WAIT return the process's exit code if it exits normally;
1007otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +00001008 return spawnvp(mode, file, args)
1009
1010 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +00001011 """spawnlpe(mode, file, *args, env) -> integer
1012
1013Execute file (which is looked for along $PATH) with arguments from
1014args in a subprocess with the supplied environment.
1015If mode == P_NOWAIT return the pid of the process.
1016If mode == P_WAIT return the process's exit code if it exits normally;
1017otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +00001018 env = args[-1]
1019 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +00001020
1021
Richard Oudkerkad34ef82013-05-07 14:23:42 +01001022 __all__.extend(["spawnlp", "spawnlpe"])
1023
Skip Montanaro269b83b2001-02-06 01:07:02 +00001024
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001025# Supply os.popen()
Antoine Pitrou877766d2011-03-19 17:00:37 +01001026def popen(cmd, mode="r", buffering=-1):
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001027 if not isinstance(cmd, str):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001028 raise TypeError("invalid cmd type (%s, expected string)" % type(cmd))
1029 if mode not in ("r", "w"):
1030 raise ValueError("invalid mode %r" % mode)
Benjamin Petersonb29614e2012-10-09 11:16:03 -04001031 if buffering == 0 or buffering is None:
Antoine Pitrou877766d2011-03-19 17:00:37 +01001032 raise ValueError("popen() does not support unbuffered streams")
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001033 import subprocess, io
1034 if mode == "r":
1035 proc = subprocess.Popen(cmd,
1036 shell=True,
1037 stdout=subprocess.PIPE,
1038 bufsize=buffering)
1039 return _wrap_close(io.TextIOWrapper(proc.stdout), proc)
1040 else:
1041 proc = subprocess.Popen(cmd,
1042 shell=True,
1043 stdin=subprocess.PIPE,
1044 bufsize=buffering)
1045 return _wrap_close(io.TextIOWrapper(proc.stdin), proc)
1046
1047# Helper for popen() -- a proxy for a file whose close waits for the process
1048class _wrap_close:
1049 def __init__(self, stream, proc):
1050 self._stream = stream
1051 self._proc = proc
1052 def close(self):
1053 self._stream.close()
Amaury Forgeot d'Arc97e5f282009-07-11 09:35:13 +00001054 returncode = self._proc.wait()
1055 if returncode == 0:
1056 return None
1057 if name == 'nt':
1058 return returncode
1059 else:
1060 return returncode << 8 # Shift left to match old behavior
Antoine Pitrouac625352009-12-09 00:01:27 +00001061 def __enter__(self):
1062 return self
1063 def __exit__(self, *args):
1064 self.close()
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001065 def __getattr__(self, name):
1066 return getattr(self._stream, name)
Thomas Heller476157b2007-09-04 11:27:47 +00001067 def __iter__(self):
1068 return iter(self._stream)
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001069
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +00001070# Supply os.fdopen()
1071def fdopen(fd, *args, **kwargs):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001072 if not isinstance(fd, int):
1073 raise TypeError("invalid fd type (%s, expected integer)" % type(fd))
1074 import io
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +00001075 return io.open(fd, *args, **kwargs)
Ethan Furmancdc08792016-06-02 15:06:09 -07001076
Brett Cannonc78ca1e2016-06-24 12:03:43 -07001077
1078# For testing purposes, make sure the function is available when the C
1079# implementation exists.
1080def _fspath(path):
1081 """Return the path representation of a path-like object.
1082
1083 If str or bytes is passed in, it is returned unchanged. Otherwise the
1084 os.PathLike interface is used to get the path representation. If the
1085 path representation is not str or bytes, TypeError is raised. If the
1086 provided path is not str, bytes, or os.PathLike, TypeError is raised.
1087 """
1088 if isinstance(path, (str, bytes)):
1089 return path
1090
1091 # Work from the object's type to match method resolution of other magic
1092 # methods.
1093 path_type = type(path)
1094 try:
1095 path_repr = path_type.__fspath__(path)
1096 except AttributeError:
1097 if hasattr(path_type, '__fspath__'):
1098 raise
1099 else:
1100 raise TypeError("expected str, bytes or os.PathLike object, "
1101 "not " + path_type.__name__)
1102 if isinstance(path_repr, (str, bytes)):
1103 return path_repr
1104 else:
1105 raise TypeError("expected {}.__fspath__() to return str or bytes, "
1106 "not {}".format(path_type.__name__,
1107 type(path_repr).__name__))
1108
1109# If there is no C implementation, make the pure Python version the
1110# implementation as transparently as possible.
Ethan Furman410ef8e2016-06-04 12:06:26 -07001111if not _exists('fspath'):
Brett Cannonc78ca1e2016-06-24 12:03:43 -07001112 fspath = _fspath
1113 fspath.__name__ = "fspath"
Ethan Furmancdc08792016-06-02 15:06:09 -07001114
Ethan Furman958b3e42016-06-04 12:49:35 -07001115
1116class PathLike(abc.ABC):
Brett Cannon5f74ebc2016-06-09 14:29:25 -07001117
1118 """Abstract base class for implementing the file system path protocol."""
1119
Ethan Furman958b3e42016-06-04 12:49:35 -07001120 @abc.abstractmethod
1121 def __fspath__(self):
Brett Cannon5f74ebc2016-06-09 14:29:25 -07001122 """Return the file system path representation of the object."""
Ethan Furman958b3e42016-06-04 12:49:35 -07001123 raise NotImplementedError
1124
1125 @classmethod
1126 def __subclasshook__(cls, subclass):
1127 return hasattr(subclass, '__fspath__')