blob: 0557f1442a2c09f286a811b675fd42087d2ac0fc [file] [log] [blame]
Georg Brandlbde4ad42006-01-20 21:36:02 +00001r"""OS routines for Mac, NT, or Posix depending on what system we're on.
Guido van Rossum31104f41992-01-14 18:28:36 +00002
Guido van Rossum54f22ed2000-02-04 15:10:34 +00003This exports:
Jesus Cea4791a242012-10-05 03:15:39 +02004 - all functions from posix, nt or ce, e.g. unlink, stat, etc.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +00005 - os.path is either posixpath or ntpath
Jesus Cea4791a242012-10-05 03:15:39 +02006 - os.name is either 'posix', 'nt' or 'ce'.
Guido van Rossum54f22ed2000-02-04 15:10:34 +00007 - os.curdir is a string representing the current directory ('.' or ':')
8 - os.pardir is a string representing the parent directory ('..' or '::')
9 - os.sep is the (or a most common) pathname separator ('/' or ':' or '\\')
Georg Brandled5b9b32008-12-05 07:45:54 +000010 - os.extsep is the extension separator (always '.')
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +000011 - os.altsep is the alternate pathname separator (None or '/')
Guido van Rossum54f22ed2000-02-04 15:10:34 +000012 - os.pathsep is the component separator used in $PATH etc
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +000013 - os.linesep is the line separator in text files ('\r' or '\n' or '\r\n')
Guido van Rossum54f22ed2000-02-04 15:10:34 +000014 - os.defpath is the default search path for executables
Martin v. Löwisbdec50f2004-06-08 08:29:33 +000015 - os.devnull is the file path of the null device ('/dev/null', etc.)
Guido van Rossum31104f41992-01-14 18:28:36 +000016
Guido van Rossum54f22ed2000-02-04 15:10:34 +000017Programs that import and use 'os' stand a better chance of being
18portable between different platforms. Of course, they must then
19only use functions that are defined by all platforms (e.g., unlink
20and opendir), and leave all pathname manipulation to os.path
21(e.g., split and join).
22"""
Guido van Rossum31104f41992-01-14 18:28:36 +000023
Skip Montanaro269b83b2001-02-06 01:07:02 +000024#'
25
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')
Guido van Rossum61de0ac1997-12-05 21:24:30 +000055 except ImportError:
56 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
61 except ImportError:
62 pass
Skip Montanaro269b83b2001-02-06 01:07:02 +000063
Guido van Rossuma28dab51997-08-29 22:36:47 +000064elif 'nt' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000065 name = 'nt'
Guido van Rossume9387ea1998-05-22 15:26:04 +000066 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000067 from nt import *
Tim Peters6757c1e2003-01-08 21:20:57 +000068 try:
69 from nt import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030070 __all__.append('_exit')
Tim Peters6757c1e2003-01-08 21:20:57 +000071 except ImportError:
72 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000073 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000074
Skip Montanaro269b83b2001-02-06 01:07:02 +000075 import nt
76 __all__.extend(_get_exports_list(nt))
77 del nt
78
Larry Hastings9cf065c2012-06-22 16:30:09 -070079 try:
80 from nt import _have_functions
81 except ImportError:
82 pass
83
Guido van Rossum18df5d41999-06-11 01:37:27 +000084elif 'ce' in _names:
85 name = 'ce'
86 linesep = '\r\n'
Guido van Rossum18df5d41999-06-11 01:37:27 +000087 from ce import *
Tim Peters6757c1e2003-01-08 21:20:57 +000088 try:
89 from ce import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030090 __all__.append('_exit')
Tim Peters6757c1e2003-01-08 21:20:57 +000091 except ImportError:
92 pass
Guido van Rossum18df5d41999-06-11 01:37:27 +000093 # We can use the standard Windows path.
Skip Montanaro117910d2003-02-14 19:35:31 +000094 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000095
Skip Montanaro269b83b2001-02-06 01:07:02 +000096 import ce
97 __all__.extend(_get_exports_list(ce))
98 del ce
99
Larry Hastings9cf065c2012-06-22 16:30:09 -0700100 try:
101 from ce import _have_functions
102 except ImportError:
103 pass
104
Guido van Rossum2979b011994-08-01 11:18:30 +0000105else:
Collin Winter828f04a2007-08-31 00:04:24 +0000106 raise ImportError('no os specific module found')
Guido van Rossume65cce51993-11-08 15:05:21 +0000107
Skip Montanaro117910d2003-02-14 19:35:31 +0000108sys.modules['os.path'] = path
Georg Brandled5b9b32008-12-05 07:45:54 +0000109from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep,
110 devnull)
Skip Montanaro269b83b2001-02-06 01:07:02 +0000111
Guido van Rossuma28dab51997-08-29 22:36:47 +0000112del _names
113
Larry Hastings9cf065c2012-06-22 16:30:09 -0700114
115if _exists("_have_functions"):
116 _globals = globals()
117 def _add(str, fn):
118 if (fn in _globals) and (str in _have_functions):
119 _set.add(_globals[fn])
120
121 _set = set()
122 _add("HAVE_FACCESSAT", "access")
123 _add("HAVE_FCHMODAT", "chmod")
124 _add("HAVE_FCHOWNAT", "chown")
125 _add("HAVE_FSTATAT", "stat")
126 _add("HAVE_FUTIMESAT", "utime")
127 _add("HAVE_LINKAT", "link")
128 _add("HAVE_MKDIRAT", "mkdir")
129 _add("HAVE_MKFIFOAT", "mkfifo")
130 _add("HAVE_MKNODAT", "mknod")
131 _add("HAVE_OPENAT", "open")
132 _add("HAVE_READLINKAT", "readlink")
133 _add("HAVE_RENAMEAT", "rename")
134 _add("HAVE_SYMLINKAT", "symlink")
135 _add("HAVE_UNLINKAT", "unlink")
Larry Hastingsb698d8e2012-06-23 16:55:07 -0700136 _add("HAVE_UNLINKAT", "rmdir")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700137 _add("HAVE_UTIMENSAT", "utime")
138 supports_dir_fd = _set
139
140 _set = set()
141 _add("HAVE_FACCESSAT", "access")
142 supports_effective_ids = _set
143
144 _set = set()
145 _add("HAVE_FCHDIR", "chdir")
146 _add("HAVE_FCHMOD", "chmod")
147 _add("HAVE_FCHOWN", "chown")
148 _add("HAVE_FDOPENDIR", "listdir")
149 _add("HAVE_FEXECVE", "execve")
150 _set.add(stat) # fstat always works
Georg Brandl306336b2012-06-24 12:55:33 +0200151 _add("HAVE_FTRUNCATE", "truncate")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700152 _add("HAVE_FUTIMENS", "utime")
153 _add("HAVE_FUTIMES", "utime")
Georg Brandl306336b2012-06-24 12:55:33 +0200154 _add("HAVE_FPATHCONF", "pathconf")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700155 if _exists("statvfs") and _exists("fstatvfs"): # mac os x10.3
156 _add("HAVE_FSTATVFS", "statvfs")
157 supports_fd = _set
158
159 _set = set()
160 _add("HAVE_FACCESSAT", "access")
Larry Hastingsdbbc0c82012-06-22 19:50:21 -0700161 # Some platforms don't support lchmod(). Often the function exists
162 # anyway, as a stub that always returns ENOSUP or perhaps EOPNOTSUPP.
163 # (No, I don't know why that's a good design.) ./configure will detect
164 # this and reject it--so HAVE_LCHMOD still won't be defined on such
165 # platforms. This is Very Helpful.
166 #
167 # However, sometimes platforms without a working lchmod() *do* have
168 # fchmodat(). (Examples: Linux kernel 3.2 with glibc 2.15,
169 # OpenIndiana 3.x.) And fchmodat() has a flag that theoretically makes
170 # it behave like lchmod(). So in theory it would be a suitable
171 # replacement for lchmod(). But when lchmod() doesn't work, fchmodat()'s
172 # flag doesn't work *either*. Sadly ./configure isn't sophisticated
173 # enough to detect this condition--it only determines whether or not
174 # fchmodat() minimally works.
175 #
176 # Therefore we simply ignore fchmodat() when deciding whether or not
177 # os.chmod supports follow_symlinks. Just checking lchmod() is
178 # sufficient. After all--if you have a working fchmodat(), your
179 # lchmod() almost certainly works too.
180 #
181 # _add("HAVE_FCHMODAT", "chmod")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700182 _add("HAVE_FCHOWNAT", "chown")
183 _add("HAVE_FSTATAT", "stat")
184 _add("HAVE_LCHFLAGS", "chflags")
185 _add("HAVE_LCHMOD", "chmod")
186 if _exists("lchown"): # mac os x10.3
187 _add("HAVE_LCHOWN", "chown")
188 _add("HAVE_LINKAT", "link")
189 _add("HAVE_LUTIMES", "utime")
190 _add("HAVE_LSTAT", "stat")
191 _add("HAVE_FSTATAT", "stat")
192 _add("HAVE_UTIMENSAT", "utime")
193 _add("MS_WINDOWS", "stat")
194 supports_follow_symlinks = _set
195
Larry Hastings9cf065c2012-06-22 16:30:09 -0700196 del _set
197 del _have_functions
198 del _globals
199 del _add
200
201
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000202# Python uses fixed values for the SEEK_ constants; they are mapped
203# to native constants if necessary in posixmodule.c
Jesus Cea94363612012-06-22 18:32:07 +0200204# Other possible SEEK values are directly imported from posixmodule.c
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000205SEEK_SET = 0
206SEEK_CUR = 1
207SEEK_END = 2
208
Terry Reedy5a22b652010-12-02 07:05:56 +0000209
210def _get_masked_mode(mode):
211 mask = umask(0)
212 umask(mask)
213 return mode & ~mask
214
Guido van Rossum4def7de1998-07-24 20:48:03 +0000215# Super directory utilities.
216# (Inspired by Eric Raymond; the doc strings are mostly his)
217
Terry Reedy5a22b652010-12-02 07:05:56 +0000218def makedirs(name, mode=0o777, exist_ok=False):
219 """makedirs(path [, mode=0o777][, exist_ok=False])
Guido van Rossum4def7de1998-07-24 20:48:03 +0000220
221 Super-mkdir; create a leaf directory and all intermediate ones.
222 Works like mkdir, except that any intermediate path segment (not
Terry Reedy5a22b652010-12-02 07:05:56 +0000223 just the rightmost) will be created if it does not exist. If the
224 target directory with the same mode as we specified already exists,
225 raises an OSError if exist_ok is False, otherwise no exception is
226 raised. This is recursive.
Guido van Rossum4def7de1998-07-24 20:48:03 +0000227
228 """
229 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000230 if not tail:
231 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000232 if head and tail and not path.exists(head):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000233 try:
Terry Reedy5a22b652010-12-02 07:05:56 +0000234 makedirs(head, mode, exist_ok)
Guido van Rossumb940e112007-01-10 16:19:56 +0000235 except OSError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000236 # be happy if someone already created the path
Christian Heimes45f9af32007-11-27 21:50:00 +0000237 if e.errno != errno.EEXIST:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000238 raise
Andrew M. Kuchling6fccc8a2003-12-23 16:33:28 +0000239 if tail == curdir: # xxx/newdir/. exists if xxx/newdir exists
240 return
Terry Reedy5a22b652010-12-02 07:05:56 +0000241 try:
242 mkdir(name, mode)
243 except OSError as e:
Gregory P. Smitha81c8562012-06-03 14:30:44 -0700244 dir_exists = path.isdir(name)
245 expected_mode = _get_masked_mode(mode)
246 if dir_exists:
247 # S_ISGID is automatically copied by the OS from parent to child
248 # directories on mkdir. Don't consider it being set to be a mode
249 # mismatch as mkdir does not unset it when not specified in mode.
250 actual_mode = st.S_IMODE(lstat(name).st_mode) & ~st.S_ISGID
251 else:
252 actual_mode = -1
253 if not (e.errno == errno.EEXIST and exist_ok and dir_exists and
254 actual_mode == expected_mode):
255 if dir_exists and actual_mode != expected_mode:
256 e.strerror += ' (mode %o != expected mode %o)' % (
257 actual_mode, expected_mode)
Terry Reedy5a22b652010-12-02 07:05:56 +0000258 raise
Guido van Rossum4def7de1998-07-24 20:48:03 +0000259
260def removedirs(name):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000261 """removedirs(path)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000262
Fredrik Lundh96c1c7a2005-11-12 15:55:04 +0000263 Super-rmdir; remove a leaf directory and all empty intermediate
Guido van Rossum4def7de1998-07-24 20:48:03 +0000264 ones. Works like rmdir except that, if the leaf directory is
265 successfully removed, directories corresponding to rightmost path
Tim Petersc4e09402003-04-25 07:11:48 +0000266 segments will be pruned away until either the whole path is
Guido van Rossum4def7de1998-07-24 20:48:03 +0000267 consumed or an error occurs. Errors during this latter phase are
268 ignored -- they generally mean that a directory was not empty.
269
270 """
271 rmdir(name)
272 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000273 if not tail:
274 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000275 while head and tail:
276 try:
277 rmdir(head)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200278 except OSrror:
Guido van Rossum4def7de1998-07-24 20:48:03 +0000279 break
280 head, tail = path.split(head)
281
282def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000283 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000284
285 Super-rename; create directories as necessary and delete any left
286 empty. Works like rename, except creation of any intermediate
287 directories needed to make the new pathname good is attempted
288 first. After the rename, directories corresponding to rightmost
289 path segments of the old name will be pruned way until either the
290 whole path is consumed or a nonempty directory is found.
291
292 Note: this function can fail with the new directory structure made
293 if you lack permissions needed to unlink the leaf directory or
294 file.
295
296 """
297 head, tail = path.split(new)
298 if head and tail and not path.exists(head):
299 makedirs(head)
300 rename(old, new)
301 head, tail = path.split(old)
302 if head and tail:
303 try:
304 removedirs(head)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200305 except OSError:
Guido van Rossum4def7de1998-07-24 20:48:03 +0000306 pass
307
Skip Montanaro269b83b2001-02-06 01:07:02 +0000308__all__.extend(["makedirs", "removedirs", "renames"])
309
Guido van Rossumd8faa362007-04-27 19:54:29 +0000310def walk(top, topdown=True, onerror=None, followlinks=False):
Tim Petersc4e09402003-04-25 07:11:48 +0000311 """Directory tree generator.
312
313 For each directory in the directory tree rooted at top (including top
314 itself, but excluding '.' and '..'), yields a 3-tuple
315
316 dirpath, dirnames, filenames
317
318 dirpath is a string, the path to the directory. dirnames is a list of
319 the names of the subdirectories in dirpath (excluding '.' and '..').
320 filenames is a list of the names of the non-directory files in dirpath.
321 Note that the names in the lists are just names, with no path components.
322 To get a full path (which begins with top) to a file or directory in
323 dirpath, do os.path.join(dirpath, name).
324
325 If optional arg 'topdown' is true or not specified, the triple for a
326 directory is generated before the triples for any of its subdirectories
327 (directories are generated top down). If topdown is false, the triple
328 for a directory is generated after the triples for all of its
329 subdirectories (directories are generated bottom up).
330
331 When topdown is true, the caller can modify the dirnames list in-place
332 (e.g., via del or slice assignment), and walk will only recurse into the
333 subdirectories whose names remain in dirnames; this can be used to prune
334 the search, or to impose a specific order of visiting. Modifying
335 dirnames when topdown is false is ineffective, since the directories in
336 dirnames have already been generated by the time dirnames itself is
337 generated.
338
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000339 By default errors from the os.listdir() call are ignored. If
340 optional arg 'onerror' is specified, it should be a function; it
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200341 will be called with one argument, an OSError instance. It can
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000342 report the error to continue with the walk, or raise the exception
343 to abort the walk. Note that the filename is available as the
344 filename attribute of the exception object.
345
Guido van Rossumd8faa362007-04-27 19:54:29 +0000346 By default, os.walk does not follow symbolic links to subdirectories on
347 systems that support them. In order to get this functionality, set the
348 optional argument 'followlinks' to true.
349
Tim Petersc4e09402003-04-25 07:11:48 +0000350 Caution: if you pass a relative pathname for top, don't change the
351 current working directory between resumptions of walk. walk never
352 changes the current directory, and assumes that the client doesn't
353 either.
354
355 Example:
356
Christian Heimes5d8da202008-05-06 13:58:24 +0000357 import os
Tim Petersc4e09402003-04-25 07:11:48 +0000358 from os.path import join, getsize
Christian Heimes5d8da202008-05-06 13:58:24 +0000359 for root, dirs, files in os.walk('python/Lib/email'):
Neal Norwitz752abd02008-05-13 04:55:24 +0000360 print(root, "consumes", end="")
361 print(sum([getsize(join(root, name)) for name in files]), end="")
362 print("bytes in", len(files), "non-directory files")
Tim Petersc4e09402003-04-25 07:11:48 +0000363 if 'CVS' in dirs:
364 dirs.remove('CVS') # don't visit CVS directories
365 """
366
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000367 islink, join, isdir = path.islink, path.join, path.isdir
Tim Petersc4e09402003-04-25 07:11:48 +0000368
369 # We may not have read permission for top, in which case we can't
Alexandre Vassalotti4e6531e2008-05-09 20:00:17 +0000370 # get a list of the files the directory contains. os.walk
Tim Petersc4e09402003-04-25 07:11:48 +0000371 # always suppressed the exception then, rather than blow up for a
372 # minor reason when (say) a thousand readable directories are still
373 # left to visit. That logic is copied here.
374 try:
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200375 # Note that listdir is global in this module due
Tim Petersc4e09402003-04-25 07:11:48 +0000376 # to earlier import-*.
377 names = listdir(top)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200378 except OSError as err:
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000379 if onerror is not None:
380 onerror(err)
Tim Petersc4e09402003-04-25 07:11:48 +0000381 return
382
383 dirs, nondirs = [], []
384 for name in names:
385 if isdir(join(top, name)):
386 dirs.append(name)
387 else:
388 nondirs.append(name)
389
390 if topdown:
391 yield top, dirs, nondirs
392 for name in dirs:
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000393 new_path = join(top, name)
394 if followlinks or not islink(new_path):
Benjamin Peterson569d0872012-05-10 16:17:35 -0500395 yield from walk(new_path, topdown, onerror, followlinks)
Tim Petersc4e09402003-04-25 07:11:48 +0000396 if not topdown:
397 yield top, dirs, nondirs
398
399__all__.append("walk")
400
Larry Hastingsc48fe982012-06-25 04:49:05 -0700401if {open, stat} <= supports_dir_fd and {listdir, stat} <= supports_fd:
Charles-François Natali7372b062012-02-05 15:15:38 +0100402
Larry Hastingsb4038062012-07-15 10:57:38 -0700403 def fwalk(top=".", topdown=True, onerror=None, *, follow_symlinks=False, dir_fd=None):
Charles-François Natali7372b062012-02-05 15:15:38 +0100404 """Directory tree generator.
405
406 This behaves exactly like walk(), except that it yields a 4-tuple
407
408 dirpath, dirnames, filenames, dirfd
409
410 `dirpath`, `dirnames` and `filenames` are identical to walk() output,
411 and `dirfd` is a file descriptor referring to the directory `dirpath`.
412
Larry Hastingsc48fe982012-06-25 04:49:05 -0700413 The advantage of fwalk() over walk() is that it's safe against symlink
Larry Hastingsb4038062012-07-15 10:57:38 -0700414 races (when follow_symlinks is False).
Charles-François Natali7372b062012-02-05 15:15:38 +0100415
Larry Hastingsc48fe982012-06-25 04:49:05 -0700416 If dir_fd is not None, it should be a file descriptor open to a directory,
417 and top should be relative; top will then be relative to that directory.
418 (dir_fd is always supported for fwalk.)
419
Charles-François Natali7372b062012-02-05 15:15:38 +0100420 Caution:
421 Since fwalk() yields file descriptors, those are only valid until the
422 next iteration step, so you should dup() them if you want to keep them
423 for a longer period.
424
425 Example:
426
427 import os
428 for root, dirs, files, rootfd in os.fwalk('python/Lib/email'):
429 print(root, "consumes", end="")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700430 print(sum([os.stat(name, dir_fd=rootfd).st_size for name in files]),
Charles-François Natali7372b062012-02-05 15:15:38 +0100431 end="")
432 print("bytes in", len(files), "non-directory files")
433 if 'CVS' in dirs:
434 dirs.remove('CVS') # don't visit CVS directories
435 """
436 # Note: To guard against symlink races, we use the standard
437 # lstat()/open()/fstat() trick.
Larry Hastingsc48fe982012-06-25 04:49:05 -0700438 orig_st = stat(top, follow_symlinks=False, dir_fd=dir_fd)
439 topfd = open(top, O_RDONLY, dir_fd=dir_fd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100440 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700441 if (follow_symlinks or (st.S_ISDIR(orig_st.st_mode) and
442 path.samestat(orig_st, stat(topfd)))):
443 yield from _fwalk(topfd, top, topdown, onerror, follow_symlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100444 finally:
445 close(topfd)
446
Larry Hastingsb4038062012-07-15 10:57:38 -0700447 def _fwalk(topfd, toppath, topdown, onerror, follow_symlinks):
Charles-François Natali7372b062012-02-05 15:15:38 +0100448 # Note: This uses O(depth of the directory tree) file descriptors: if
449 # necessary, it can be adapted to only require O(1) FDs, see issue
450 # #13734.
451
Larry Hastings9cf065c2012-06-22 16:30:09 -0700452 names = listdir(topfd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100453 dirs, nondirs = [], []
454 for name in names:
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200455 try:
456 # Here, we don't use AT_SYMLINK_NOFOLLOW to be consistent with
457 # walk() which reports symlinks to directories as directories.
458 # We do however check for symlinks before recursing into
459 # a subdirectory.
Larry Hastings9cf065c2012-06-22 16:30:09 -0700460 if st.S_ISDIR(stat(name, dir_fd=topfd).st_mode):
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200461 dirs.append(name)
462 else:
463 nondirs.append(name)
464 except FileNotFoundError:
465 try:
466 # Add dangling symlinks, ignore disappeared files
Larry Hastings9cf065c2012-06-22 16:30:09 -0700467 if st.S_ISLNK(stat(name, dir_fd=topfd, follow_symlinks=False)
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200468 .st_mode):
469 nondirs.append(name)
470 except FileNotFoundError:
471 continue
Charles-François Natali7372b062012-02-05 15:15:38 +0100472
473 if topdown:
474 yield toppath, dirs, nondirs, topfd
475
476 for name in dirs:
477 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700478 orig_st = stat(name, dir_fd=topfd, follow_symlinks=follow_symlinks)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700479 dirfd = open(name, O_RDONLY, dir_fd=topfd)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200480 except OSError as err:
Charles-François Natali7372b062012-02-05 15:15:38 +0100481 if onerror is not None:
482 onerror(err)
483 return
484 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700485 if follow_symlinks or path.samestat(orig_st, stat(dirfd)):
Charles-François Natali7372b062012-02-05 15:15:38 +0100486 dirpath = path.join(toppath, name)
Larry Hastingsb4038062012-07-15 10:57:38 -0700487 yield from _fwalk(dirfd, dirpath, topdown, onerror, follow_symlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100488 finally:
489 close(dirfd)
490
491 if not topdown:
492 yield toppath, dirs, nondirs, topfd
493
494 __all__.append("fwalk")
495
Guido van Rossuma28dab51997-08-29 22:36:47 +0000496# Make sure os.environ exists, at least
497try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000498 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000499except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000500 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000501
Guido van Rossume65cce51993-11-08 15:05:21 +0000502def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000503 """execl(file, *args)
504
505 Execute the executable file with argument list args, replacing the
506 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000507 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000508
509def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000510 """execle(file, *args, env)
511
512 Execute the executable file with argument list args and
513 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000514 env = args[-1]
515 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000516
517def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000518 """execlp(file, *args)
519
520 Execute the executable file (which is searched for along $PATH)
521 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000522 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000523
Guido van Rossum030afb11995-03-14 17:27:18 +0000524def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000525 """execlpe(file, *args, env)
526
527 Execute the executable file (which is searched for along $PATH)
528 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000529 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000530 env = args[-1]
531 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000532
Guido van Rossume65cce51993-11-08 15:05:21 +0000533def execvp(file, args):
Matthias Klosea09c54f2010-01-31 16:48:44 +0000534 """execvp(file, args)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000535
536 Execute the executable file (which is searched for along $PATH)
537 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000538 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000539 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000540
541def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000542 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000543
544 Execute the executable file (which is searched for along $PATH)
545 with argument list args and environment env , replacing the
546 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000547 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000548 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000549
Skip Montanaro269b83b2001-02-06 01:07:02 +0000550__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
551
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000552def _execvpe(file, args, env=None):
553 if env is not None:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000554 exec_func = execve
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000555 argrest = (args, env)
556 else:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000557 exec_func = execv
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000558 argrest = (args,)
559 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000560
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000561 head, tail = path.split(file)
562 if head:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000563 exec_func(file, *argrest)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000564 return
Guido van Rossume7ba4952007-06-06 23:52:48 +0000565 last_exc = saved_exc = None
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000566 saved_tb = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000567 path_list = get_exec_path(env)
568 if name != 'nt':
569 file = fsencode(file)
570 path_list = map(fsencode, path_list)
571 for dir in path_list:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000572 fullname = path.join(dir, file)
573 try:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000574 exec_func(fullname, *argrest)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200575 except OSError as e:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000576 last_exc = e
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000577 tb = sys.exc_info()[2]
Christian Heimes45f9af32007-11-27 21:50:00 +0000578 if (e.errno != errno.ENOENT and e.errno != errno.ENOTDIR
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000579 and saved_exc is None):
580 saved_exc = e
581 saved_tb = tb
582 if saved_exc:
Benjamin Peterson4b068192009-02-20 03:19:25 +0000583 raise saved_exc.with_traceback(saved_tb)
584 raise last_exc.with_traceback(tb)
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000585
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000586
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000587def get_exec_path(env=None):
588 """Returns the sequence of directories that will be searched for the
589 named executable (similar to a shell) when launching a process.
590
591 *env* must be an environment variable dict or None. If *env* is None,
592 os.environ will be used.
593 """
Victor Stinner273b7662010-11-06 12:59:33 +0000594 # Use a local import instead of a global import to limit the number of
595 # modules loaded at startup: the os module is always loaded at startup by
596 # Python. It may also avoid a bootstrap issue.
Victor Stinner6f35eda2010-10-29 00:38:58 +0000597 import warnings
598
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000599 if env is None:
600 env = environ
Victor Stinnerb745a742010-05-18 17:17:23 +0000601
Victor Stinnerbb4f2182010-11-07 15:43:39 +0000602 # {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a
603 # BytesWarning when using python -b or python -bb: ignore the warning
Victor Stinner273b7662010-11-06 12:59:33 +0000604 with warnings.catch_warnings():
605 warnings.simplefilter("ignore", BytesWarning)
Victor Stinnerb745a742010-05-18 17:17:23 +0000606
Victor Stinnerb745a742010-05-18 17:17:23 +0000607 try:
Victor Stinner273b7662010-11-06 12:59:33 +0000608 path_list = env.get('PATH')
609 except TypeError:
610 path_list = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000611
Victor Stinner273b7662010-11-06 12:59:33 +0000612 if supports_bytes_environ:
613 try:
614 path_listb = env[b'PATH']
615 except (KeyError, TypeError):
616 pass
617 else:
618 if path_list is not None:
619 raise ValueError(
620 "env cannot contain 'PATH' and b'PATH' keys")
621 path_list = path_listb
622
623 if path_list is not None and isinstance(path_list, bytes):
624 path_list = fsdecode(path_list)
Victor Stinnerb745a742010-05-18 17:17:23 +0000625
626 if path_list is None:
627 path_list = defpath
628 return path_list.split(pathsep)
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000629
630
Skip Montanaro289bc052007-08-17 02:30:27 +0000631# Change environ to automatically call putenv(), unsetenv if they exist.
Raymond Hettinger158c9c22011-02-22 00:41:50 +0000632from collections.abc import MutableMapping
Skip Montanaro289bc052007-08-17 02:30:27 +0000633
634class _Environ(MutableMapping):
Victor Stinner84ae1182010-05-06 22:05:07 +0000635 def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv):
636 self.encodekey = encodekey
637 self.decodekey = decodekey
638 self.encodevalue = encodevalue
639 self.decodevalue = decodevalue
Skip Montanaro289bc052007-08-17 02:30:27 +0000640 self.putenv = putenv
641 self.unsetenv = unsetenv
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000642 self._data = data
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000643
Skip Montanaro289bc052007-08-17 02:30:27 +0000644 def __getitem__(self, key):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000645 value = self._data[self.encodekey(key)]
Victor Stinner84ae1182010-05-06 22:05:07 +0000646 return self.decodevalue(value)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000647
Skip Montanaro289bc052007-08-17 02:30:27 +0000648 def __setitem__(self, key, value):
Victor Stinner84ae1182010-05-06 22:05:07 +0000649 key = self.encodekey(key)
650 value = self.encodevalue(value)
Skip Montanaro289bc052007-08-17 02:30:27 +0000651 self.putenv(key, value)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000652 self._data[key] = value
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000653
Skip Montanaro289bc052007-08-17 02:30:27 +0000654 def __delitem__(self, key):
Victor Stinner84ae1182010-05-06 22:05:07 +0000655 key = self.encodekey(key)
Skip Montanaro289bc052007-08-17 02:30:27 +0000656 self.unsetenv(key)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000657 del self._data[key]
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000658
Skip Montanaro289bc052007-08-17 02:30:27 +0000659 def __iter__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000660 for key in self._data:
Victor Stinner84ae1182010-05-06 22:05:07 +0000661 yield self.decodekey(key)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000662
Skip Montanaro289bc052007-08-17 02:30:27 +0000663 def __len__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000664 return len(self._data)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000665
666 def __repr__(self):
Victor Stinnerbed71172010-07-28 21:25:42 +0000667 return 'environ({{{}}})'.format(', '.join(
Victor Stinnerd73c1a32010-07-28 21:23:23 +0000668 ('{!r}: {!r}'.format(self.decodekey(key), self.decodevalue(value))
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000669 for key, value in self._data.items())))
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000670
Skip Montanaro289bc052007-08-17 02:30:27 +0000671 def copy(self):
672 return dict(self)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000673
Skip Montanaro289bc052007-08-17 02:30:27 +0000674 def setdefault(self, key, value):
675 if key not in self:
676 self[key] = value
677 return self[key]
678
679try:
680 _putenv = putenv
681except NameError:
682 _putenv = lambda key, value: None
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000683else:
Skip Montanaro289bc052007-08-17 02:30:27 +0000684 __all__.append("putenv")
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000685
Skip Montanaro289bc052007-08-17 02:30:27 +0000686try:
687 _unsetenv = unsetenv
688except NameError:
689 _unsetenv = lambda key: _putenv(key, "")
690else:
691 __all__.append("unsetenv")
Guido van Rossumc524d952001-10-19 01:31:59 +0000692
Victor Stinner84ae1182010-05-06 22:05:07 +0000693def _createenviron():
Jesus Cea4791a242012-10-05 03:15:39 +0200694 if name == 'nt':
Victor Stinner84ae1182010-05-06 22:05:07 +0000695 # Where Env Var Names Must Be UPPERCASE
696 def check_str(value):
697 if not isinstance(value, str):
698 raise TypeError("str expected, not %s" % type(value).__name__)
699 return value
700 encode = check_str
701 decode = str
702 def encodekey(key):
703 return encode(key).upper()
704 data = {}
705 for key, value in environ.items():
706 data[encodekey(key)] = value
707 else:
708 # Where Env Var Names Can Be Mixed Case
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000709 encoding = sys.getfilesystemencoding()
Victor Stinner84ae1182010-05-06 22:05:07 +0000710 def encode(value):
711 if not isinstance(value, str):
712 raise TypeError("str expected, not %s" % type(value).__name__)
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000713 return value.encode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000714 def decode(value):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000715 return value.decode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000716 encodekey = encode
717 data = environ
718 return _Environ(data,
719 encodekey, decode,
720 encode, decode,
721 _putenv, _unsetenv)
Guido van Rossumc524d952001-10-19 01:31:59 +0000722
Victor Stinner84ae1182010-05-06 22:05:07 +0000723# unicode environ
724environ = _createenviron()
725del _createenviron
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000726
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000727
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000728def getenv(key, default=None):
Tim Peters2c60f7a2003-01-29 03:49:43 +0000729 """Get an environment variable, return None if it doesn't exist.
Victor Stinner84ae1182010-05-06 22:05:07 +0000730 The optional second argument can specify an alternate default.
731 key, default and the result are str."""
Tim Peters2c60f7a2003-01-29 03:49:43 +0000732 return environ.get(key, default)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000733
Jesus Cea4791a242012-10-05 03:15:39 +0200734supports_bytes_environ = (name != 'nt')
Victor Stinnerb745a742010-05-18 17:17:23 +0000735__all__.extend(("getenv", "supports_bytes_environ"))
736
737if supports_bytes_environ:
Victor Stinner84ae1182010-05-06 22:05:07 +0000738 def _check_bytes(value):
739 if not isinstance(value, bytes):
740 raise TypeError("bytes expected, not %s" % type(value).__name__)
741 return value
742
743 # bytes environ
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000744 environb = _Environ(environ._data,
Victor Stinner84ae1182010-05-06 22:05:07 +0000745 _check_bytes, bytes,
746 _check_bytes, bytes,
747 _putenv, _unsetenv)
748 del _check_bytes
749
750 def getenvb(key, default=None):
751 """Get an environment variable, return None if it doesn't exist.
752 The optional second argument can specify an alternate default.
753 key, default and the result are bytes."""
754 return environb.get(key, default)
Victor Stinner70120e22010-07-29 17:19:38 +0000755
756 __all__.extend(("environb", "getenvb"))
Victor Stinner84ae1182010-05-06 22:05:07 +0000757
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000758def _fscodec():
759 encoding = sys.getfilesystemencoding()
760 if encoding == 'mbcs':
Victor Stinnere882aac2010-10-24 21:12:26 +0000761 errors = 'strict'
Victor Stinner313a1202010-06-11 23:56:51 +0000762 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000763 errors = 'surrogateescape'
Victor Stinnere8d51452010-08-19 01:05:19 +0000764
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000765 def fsencode(filename):
766 """
767 Encode filename to the filesystem encoding with 'surrogateescape' error
768 handler, return bytes unchanged. On Windows, use 'strict' error handler if
769 the file system encoding is 'mbcs' (which is the default encoding).
770 """
771 if isinstance(filename, bytes):
772 return filename
773 elif isinstance(filename, str):
774 return filename.encode(encoding, errors)
Victor Stinnere8d51452010-08-19 01:05:19 +0000775 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000776 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
777
778 def fsdecode(filename):
779 """
780 Decode filename from the filesystem encoding with 'surrogateescape' error
781 handler, return str unchanged. On Windows, use 'strict' error handler if
782 the file system encoding is 'mbcs' (which is the default encoding).
783 """
784 if isinstance(filename, str):
785 return filename
786 elif isinstance(filename, bytes):
787 return filename.decode(encoding, errors)
788 else:
789 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
790
791 return fsencode, fsdecode
792
793fsencode, fsdecode = _fscodec()
794del _fscodec
Victor Stinner449c4662010-05-08 11:10:09 +0000795
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000796# Supply spawn*() (probably only for Unix)
797if _exists("fork") and not _exists("spawnv") and _exists("execv"):
798
799 P_WAIT = 0
800 P_NOWAIT = P_NOWAITO = 1
801
Petri Lehtinen3bc37f22012-05-23 21:36:16 +0300802 __all__.extend(["P_WAIT", "P_NOWAIT", "P_NOWAITO"])
803
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000804 # XXX Should we support P_DETACH? I suppose it could fork()**2
805 # and close the std I/O streams. Also, P_OVERLAY is the same
806 # as execv*()?
807
808 def _spawnvef(mode, file, args, env, func):
809 # Internal helper; func is the exec*() function to use
810 pid = fork()
811 if not pid:
812 # Child
813 try:
814 if env is None:
815 func(file, args)
816 else:
817 func(file, args, env)
818 except:
819 _exit(127)
820 else:
821 # Parent
822 if mode == P_NOWAIT:
823 return pid # Caller is responsible for waiting!
824 while 1:
825 wpid, sts = waitpid(pid, 0)
826 if WIFSTOPPED(sts):
827 continue
828 elif WIFSIGNALED(sts):
829 return -WTERMSIG(sts)
830 elif WIFEXITED(sts):
831 return WEXITSTATUS(sts)
832 else:
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200833 raise OSError("Not stopped, signaled or exited???")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000834
835 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000836 """spawnv(mode, file, args) -> integer
837
838Execute file with arguments from args in a subprocess.
839If mode == P_NOWAIT return the pid of the process.
840If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000841otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000842 return _spawnvef(mode, file, args, None, execv)
843
844 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000845 """spawnve(mode, file, args, env) -> integer
846
847Execute file with arguments from args in a subprocess with the
848specified environment.
849If mode == P_NOWAIT return the pid of the process.
850If mode == P_WAIT return the process's exit code if it exits normally;
851otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000852 return _spawnvef(mode, file, args, env, execve)
853
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000854 # Note: spawnvp[e] is't currently supported on Windows
855
856 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000857 """spawnvp(mode, file, args) -> integer
858
859Execute file (which is looked for along $PATH) with arguments from
860args in a subprocess.
861If mode == P_NOWAIT return the pid of the process.
862If mode == P_WAIT return the process's exit code if it exits normally;
863otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000864 return _spawnvef(mode, file, args, None, execvp)
865
866 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000867 """spawnvpe(mode, file, args, env) -> integer
868
869Execute file (which is looked for along $PATH) with arguments from
870args in a subprocess with the supplied environment.
871If mode == P_NOWAIT return the pid of the process.
872If mode == P_WAIT return the process's exit code if it exits normally;
873otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000874 return _spawnvef(mode, file, args, env, execvpe)
875
876if _exists("spawnv"):
877 # These aren't supplied by the basic Windows code
878 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000879
880 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000881 """spawnl(mode, file, *args) -> integer
882
883Execute file with arguments from args in a subprocess.
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 spawnv(mode, file, args)
888
889 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000890 """spawnle(mode, file, *args, env) -> integer
891
892Execute file with arguments from args in a subprocess with the
893supplied environment.
894If mode == P_NOWAIT return the pid of the process.
895If mode == P_WAIT return the process's exit code if it exits normally;
896otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000897 env = args[-1]
898 return spawnve(mode, file, args[:-1], env)
899
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000900
901 __all__.extend(["spawnv", "spawnve", "spawnl", "spawnle",])
902
903
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000904if _exists("spawnvp"):
905 # At the moment, Windows doesn't implement spawnvp[e],
906 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000907 def spawnlp(mode, file, *args):
Neal Norwitzb7f68102003-07-02 02:49:33 +0000908 """spawnlp(mode, file, *args) -> integer
Guido van Rossume0cd2912000-04-21 18:35:36 +0000909
910Execute file (which is looked for along $PATH) with arguments from
911args in a subprocess with the supplied environment.
912If mode == P_NOWAIT return the pid of the process.
913If mode == P_WAIT return the process's exit code if it exits normally;
914otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000915 return spawnvp(mode, file, args)
916
917 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000918 """spawnlpe(mode, file, *args, env) -> integer
919
920Execute file (which is looked for along $PATH) with arguments from
921args in a subprocess with the supplied environment.
922If mode == P_NOWAIT return the pid of the process.
923If mode == P_WAIT return the process's exit code if it exits normally;
924otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000925 env = args[-1]
926 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000927
928
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000929 __all__.extend(["spawnvp", "spawnvpe", "spawnlp", "spawnlpe",])
Skip Montanaro269b83b2001-02-06 01:07:02 +0000930
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000931import copyreg as _copyreg
Michael W. Hudson0e025302002-03-06 17:11:18 +0000932
933def _make_stat_result(tup, dict):
934 return stat_result(tup, dict)
935
936def _pickle_stat_result(sr):
937 (type, args) = sr.__reduce__()
938 return (_make_stat_result, args)
939
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000940try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000941 _copyreg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000942except NameError: # stat_result may not exist
943 pass
Michael W. Hudson0e025302002-03-06 17:11:18 +0000944
945def _make_statvfs_result(tup, dict):
946 return statvfs_result(tup, dict)
947
948def _pickle_statvfs_result(sr):
949 (type, args) = sr.__reduce__()
950 return (_make_statvfs_result, args)
951
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000952try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000953 _copyreg.pickle(statvfs_result, _pickle_statvfs_result,
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000954 _make_statvfs_result)
Michael W. Hudsone5363b72002-03-15 10:21:59 +0000955except NameError: # statvfs_result may not exist
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000956 pass
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000957
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000958# Supply os.popen()
Antoine Pitrou877766d2011-03-19 17:00:37 +0100959def popen(cmd, mode="r", buffering=-1):
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000960 if not isinstance(cmd, str):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000961 raise TypeError("invalid cmd type (%s, expected string)" % type(cmd))
962 if mode not in ("r", "w"):
963 raise ValueError("invalid mode %r" % mode)
Benjamin Petersonb29614e2012-10-09 11:16:03 -0400964 if buffering == 0 or buffering is None:
Antoine Pitrou877766d2011-03-19 17:00:37 +0100965 raise ValueError("popen() does not support unbuffered streams")
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000966 import subprocess, io
967 if mode == "r":
968 proc = subprocess.Popen(cmd,
969 shell=True,
970 stdout=subprocess.PIPE,
971 bufsize=buffering)
972 return _wrap_close(io.TextIOWrapper(proc.stdout), proc)
973 else:
974 proc = subprocess.Popen(cmd,
975 shell=True,
976 stdin=subprocess.PIPE,
977 bufsize=buffering)
978 return _wrap_close(io.TextIOWrapper(proc.stdin), proc)
979
980# Helper for popen() -- a proxy for a file whose close waits for the process
981class _wrap_close:
982 def __init__(self, stream, proc):
983 self._stream = stream
984 self._proc = proc
985 def close(self):
986 self._stream.close()
Amaury Forgeot d'Arc97e5f282009-07-11 09:35:13 +0000987 returncode = self._proc.wait()
988 if returncode == 0:
989 return None
990 if name == 'nt':
991 return returncode
992 else:
993 return returncode << 8 # Shift left to match old behavior
Antoine Pitrouac625352009-12-09 00:01:27 +0000994 def __enter__(self):
995 return self
996 def __exit__(self, *args):
997 self.close()
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000998 def __getattr__(self, name):
999 return getattr(self._stream, name)
Thomas Heller476157b2007-09-04 11:27:47 +00001000 def __iter__(self):
1001 return iter(self._stream)
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001002
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +00001003# Supply os.fdopen()
1004def fdopen(fd, *args, **kwargs):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001005 if not isinstance(fd, int):
1006 raise TypeError("invalid fd type (%s, expected integer)" % type(fd))
1007 import io
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +00001008 return io.open(fd, *args, **kwargs)