blob: 659f3cc047669cffd9b83f7449b321cc7da0174b [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
Serhiy Storchaka4ab23bf2013-01-08 11:32:58 +0200239 cdir = curdir
240 if isinstance(tail, bytes):
241 cdir = bytes(curdir, 'ASCII')
242 if tail == cdir: # xxx/newdir/. exists if xxx/newdir exists
Andrew M. Kuchling6fccc8a2003-12-23 16:33:28 +0000243 return
Terry Reedy5a22b652010-12-02 07:05:56 +0000244 try:
245 mkdir(name, mode)
246 except OSError as e:
Gregory P. Smitha81c8562012-06-03 14:30:44 -0700247 dir_exists = path.isdir(name)
248 expected_mode = _get_masked_mode(mode)
249 if dir_exists:
250 # S_ISGID is automatically copied by the OS from parent to child
251 # directories on mkdir. Don't consider it being set to be a mode
252 # mismatch as mkdir does not unset it when not specified in mode.
253 actual_mode = st.S_IMODE(lstat(name).st_mode) & ~st.S_ISGID
254 else:
255 actual_mode = -1
256 if not (e.errno == errno.EEXIST and exist_ok and dir_exists and
257 actual_mode == expected_mode):
258 if dir_exists and actual_mode != expected_mode:
259 e.strerror += ' (mode %o != expected mode %o)' % (
260 actual_mode, expected_mode)
Terry Reedy5a22b652010-12-02 07:05:56 +0000261 raise
Guido van Rossum4def7de1998-07-24 20:48:03 +0000262
263def removedirs(name):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000264 """removedirs(path)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000265
Fredrik Lundh96c1c7a2005-11-12 15:55:04 +0000266 Super-rmdir; remove a leaf directory and all empty intermediate
Guido van Rossum4def7de1998-07-24 20:48:03 +0000267 ones. Works like rmdir except that, if the leaf directory is
268 successfully removed, directories corresponding to rightmost path
Tim Petersc4e09402003-04-25 07:11:48 +0000269 segments will be pruned away until either the whole path is
Guido van Rossum4def7de1998-07-24 20:48:03 +0000270 consumed or an error occurs. Errors during this latter phase are
271 ignored -- they generally mean that a directory was not empty.
272
273 """
274 rmdir(name)
275 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000276 if not tail:
277 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000278 while head and tail:
279 try:
280 rmdir(head)
Andrew Svetlov2552bc02012-12-24 21:47:24 +0200281 except OSError:
Guido van Rossum4def7de1998-07-24 20:48:03 +0000282 break
283 head, tail = path.split(head)
284
285def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000286 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000287
288 Super-rename; create directories as necessary and delete any left
289 empty. Works like rename, except creation of any intermediate
290 directories needed to make the new pathname good is attempted
291 first. After the rename, directories corresponding to rightmost
292 path segments of the old name will be pruned way until either the
293 whole path is consumed or a nonempty directory is found.
294
295 Note: this function can fail with the new directory structure made
296 if you lack permissions needed to unlink the leaf directory or
297 file.
298
299 """
300 head, tail = path.split(new)
301 if head and tail and not path.exists(head):
302 makedirs(head)
303 rename(old, new)
304 head, tail = path.split(old)
305 if head and tail:
306 try:
307 removedirs(head)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200308 except OSError:
Guido van Rossum4def7de1998-07-24 20:48:03 +0000309 pass
310
Skip Montanaro269b83b2001-02-06 01:07:02 +0000311__all__.extend(["makedirs", "removedirs", "renames"])
312
Guido van Rossumd8faa362007-04-27 19:54:29 +0000313def walk(top, topdown=True, onerror=None, followlinks=False):
Tim Petersc4e09402003-04-25 07:11:48 +0000314 """Directory tree generator.
315
316 For each directory in the directory tree rooted at top (including top
317 itself, but excluding '.' and '..'), yields a 3-tuple
318
319 dirpath, dirnames, filenames
320
321 dirpath is a string, the path to the directory. dirnames is a list of
322 the names of the subdirectories in dirpath (excluding '.' and '..').
323 filenames is a list of the names of the non-directory files in dirpath.
324 Note that the names in the lists are just names, with no path components.
325 To get a full path (which begins with top) to a file or directory in
326 dirpath, do os.path.join(dirpath, name).
327
328 If optional arg 'topdown' is true or not specified, the triple for a
329 directory is generated before the triples for any of its subdirectories
330 (directories are generated top down). If topdown is false, the triple
331 for a directory is generated after the triples for all of its
332 subdirectories (directories are generated bottom up).
333
334 When topdown is true, the caller can modify the dirnames list in-place
335 (e.g., via del or slice assignment), and walk will only recurse into the
336 subdirectories whose names remain in dirnames; this can be used to prune
337 the search, or to impose a specific order of visiting. Modifying
338 dirnames when topdown is false is ineffective, since the directories in
339 dirnames have already been generated by the time dirnames itself is
340 generated.
341
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000342 By default errors from the os.listdir() call are ignored. If
343 optional arg 'onerror' is specified, it should be a function; it
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200344 will be called with one argument, an OSError instance. It can
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000345 report the error to continue with the walk, or raise the exception
346 to abort the walk. Note that the filename is available as the
347 filename attribute of the exception object.
348
Guido van Rossumd8faa362007-04-27 19:54:29 +0000349 By default, os.walk does not follow symbolic links to subdirectories on
350 systems that support them. In order to get this functionality, set the
351 optional argument 'followlinks' to true.
352
Tim Petersc4e09402003-04-25 07:11:48 +0000353 Caution: if you pass a relative pathname for top, don't change the
354 current working directory between resumptions of walk. walk never
355 changes the current directory, and assumes that the client doesn't
356 either.
357
358 Example:
359
Christian Heimes5d8da202008-05-06 13:58:24 +0000360 import os
Tim Petersc4e09402003-04-25 07:11:48 +0000361 from os.path import join, getsize
Christian Heimes5d8da202008-05-06 13:58:24 +0000362 for root, dirs, files in os.walk('python/Lib/email'):
Neal Norwitz752abd02008-05-13 04:55:24 +0000363 print(root, "consumes", end="")
364 print(sum([getsize(join(root, name)) for name in files]), end="")
365 print("bytes in", len(files), "non-directory files")
Tim Petersc4e09402003-04-25 07:11:48 +0000366 if 'CVS' in dirs:
367 dirs.remove('CVS') # don't visit CVS directories
368 """
369
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000370 islink, join, isdir = path.islink, path.join, path.isdir
Tim Petersc4e09402003-04-25 07:11:48 +0000371
372 # We may not have read permission for top, in which case we can't
Alexandre Vassalotti4e6531e2008-05-09 20:00:17 +0000373 # get a list of the files the directory contains. os.walk
Tim Petersc4e09402003-04-25 07:11:48 +0000374 # always suppressed the exception then, rather than blow up for a
375 # minor reason when (say) a thousand readable directories are still
376 # left to visit. That logic is copied here.
377 try:
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200378 # Note that listdir is global in this module due
Tim Petersc4e09402003-04-25 07:11:48 +0000379 # to earlier import-*.
380 names = listdir(top)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200381 except OSError as err:
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000382 if onerror is not None:
383 onerror(err)
Tim Petersc4e09402003-04-25 07:11:48 +0000384 return
385
386 dirs, nondirs = [], []
387 for name in names:
388 if isdir(join(top, name)):
389 dirs.append(name)
390 else:
391 nondirs.append(name)
392
393 if topdown:
394 yield top, dirs, nondirs
395 for name in dirs:
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000396 new_path = join(top, name)
397 if followlinks or not islink(new_path):
Benjamin Peterson569d0872012-05-10 16:17:35 -0500398 yield from walk(new_path, topdown, onerror, followlinks)
Tim Petersc4e09402003-04-25 07:11:48 +0000399 if not topdown:
400 yield top, dirs, nondirs
401
402__all__.append("walk")
403
Larry Hastingsc48fe982012-06-25 04:49:05 -0700404if {open, stat} <= supports_dir_fd and {listdir, stat} <= supports_fd:
Charles-François Natali7372b062012-02-05 15:15:38 +0100405
Larry Hastingsb4038062012-07-15 10:57:38 -0700406 def fwalk(top=".", topdown=True, onerror=None, *, follow_symlinks=False, dir_fd=None):
Charles-François Natali7372b062012-02-05 15:15:38 +0100407 """Directory tree generator.
408
409 This behaves exactly like walk(), except that it yields a 4-tuple
410
411 dirpath, dirnames, filenames, dirfd
412
413 `dirpath`, `dirnames` and `filenames` are identical to walk() output,
414 and `dirfd` is a file descriptor referring to the directory `dirpath`.
415
Larry Hastingsc48fe982012-06-25 04:49:05 -0700416 The advantage of fwalk() over walk() is that it's safe against symlink
Larry Hastingsb4038062012-07-15 10:57:38 -0700417 races (when follow_symlinks is False).
Charles-François Natali7372b062012-02-05 15:15:38 +0100418
Larry Hastingsc48fe982012-06-25 04:49:05 -0700419 If dir_fd is not None, it should be a file descriptor open to a directory,
420 and top should be relative; top will then be relative to that directory.
421 (dir_fd is always supported for fwalk.)
422
Charles-François Natali7372b062012-02-05 15:15:38 +0100423 Caution:
424 Since fwalk() yields file descriptors, those are only valid until the
425 next iteration step, so you should dup() them if you want to keep them
426 for a longer period.
427
428 Example:
429
430 import os
431 for root, dirs, files, rootfd in os.fwalk('python/Lib/email'):
432 print(root, "consumes", end="")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700433 print(sum([os.stat(name, dir_fd=rootfd).st_size for name in files]),
Charles-François Natali7372b062012-02-05 15:15:38 +0100434 end="")
435 print("bytes in", len(files), "non-directory files")
436 if 'CVS' in dirs:
437 dirs.remove('CVS') # don't visit CVS directories
438 """
439 # Note: To guard against symlink races, we use the standard
440 # lstat()/open()/fstat() trick.
Larry Hastingsc48fe982012-06-25 04:49:05 -0700441 orig_st = stat(top, follow_symlinks=False, dir_fd=dir_fd)
442 topfd = open(top, O_RDONLY, dir_fd=dir_fd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100443 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700444 if (follow_symlinks or (st.S_ISDIR(orig_st.st_mode) and
445 path.samestat(orig_st, stat(topfd)))):
446 yield from _fwalk(topfd, top, topdown, onerror, follow_symlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100447 finally:
448 close(topfd)
449
Larry Hastingsb4038062012-07-15 10:57:38 -0700450 def _fwalk(topfd, toppath, topdown, onerror, follow_symlinks):
Charles-François Natali7372b062012-02-05 15:15:38 +0100451 # Note: This uses O(depth of the directory tree) file descriptors: if
452 # necessary, it can be adapted to only require O(1) FDs, see issue
453 # #13734.
454
Larry Hastings9cf065c2012-06-22 16:30:09 -0700455 names = listdir(topfd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100456 dirs, nondirs = [], []
457 for name in names:
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200458 try:
459 # Here, we don't use AT_SYMLINK_NOFOLLOW to be consistent with
460 # walk() which reports symlinks to directories as directories.
461 # We do however check for symlinks before recursing into
462 # a subdirectory.
Larry Hastings9cf065c2012-06-22 16:30:09 -0700463 if st.S_ISDIR(stat(name, dir_fd=topfd).st_mode):
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200464 dirs.append(name)
465 else:
466 nondirs.append(name)
467 except FileNotFoundError:
468 try:
469 # Add dangling symlinks, ignore disappeared files
Larry Hastings9cf065c2012-06-22 16:30:09 -0700470 if st.S_ISLNK(stat(name, dir_fd=topfd, follow_symlinks=False)
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200471 .st_mode):
472 nondirs.append(name)
473 except FileNotFoundError:
474 continue
Charles-François Natali7372b062012-02-05 15:15:38 +0100475
476 if topdown:
477 yield toppath, dirs, nondirs, topfd
478
479 for name in dirs:
480 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700481 orig_st = stat(name, dir_fd=topfd, follow_symlinks=follow_symlinks)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700482 dirfd = open(name, O_RDONLY, dir_fd=topfd)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200483 except OSError as err:
Charles-François Natali7372b062012-02-05 15:15:38 +0100484 if onerror is not None:
485 onerror(err)
486 return
487 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700488 if follow_symlinks or path.samestat(orig_st, stat(dirfd)):
Charles-François Natali7372b062012-02-05 15:15:38 +0100489 dirpath = path.join(toppath, name)
Larry Hastingsb4038062012-07-15 10:57:38 -0700490 yield from _fwalk(dirfd, dirpath, topdown, onerror, follow_symlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100491 finally:
492 close(dirfd)
493
494 if not topdown:
495 yield toppath, dirs, nondirs, topfd
496
497 __all__.append("fwalk")
498
Guido van Rossuma28dab51997-08-29 22:36:47 +0000499# Make sure os.environ exists, at least
500try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000501 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000502except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000503 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000504
Guido van Rossume65cce51993-11-08 15:05:21 +0000505def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000506 """execl(file, *args)
507
508 Execute the executable file with argument list args, replacing the
509 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000510 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000511
512def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000513 """execle(file, *args, env)
514
515 Execute the executable file with argument list args and
516 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000517 env = args[-1]
518 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000519
520def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000521 """execlp(file, *args)
522
523 Execute the executable file (which is searched for along $PATH)
524 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000525 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000526
Guido van Rossum030afb11995-03-14 17:27:18 +0000527def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000528 """execlpe(file, *args, env)
529
530 Execute the executable file (which is searched for along $PATH)
531 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000532 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000533 env = args[-1]
534 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000535
Guido van Rossume65cce51993-11-08 15:05:21 +0000536def execvp(file, args):
Matthias Klosea09c54f2010-01-31 16:48:44 +0000537 """execvp(file, args)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000538
539 Execute the executable file (which is searched for along $PATH)
540 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000541 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000542 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000543
544def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000545 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000546
547 Execute the executable file (which is searched for along $PATH)
548 with argument list args and environment env , replacing the
549 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000550 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000551 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000552
Skip Montanaro269b83b2001-02-06 01:07:02 +0000553__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
554
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000555def _execvpe(file, args, env=None):
556 if env is not None:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000557 exec_func = execve
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000558 argrest = (args, env)
559 else:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000560 exec_func = execv
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000561 argrest = (args,)
562 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000563
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000564 head, tail = path.split(file)
565 if head:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000566 exec_func(file, *argrest)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000567 return
Guido van Rossume7ba4952007-06-06 23:52:48 +0000568 last_exc = saved_exc = None
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000569 saved_tb = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000570 path_list = get_exec_path(env)
571 if name != 'nt':
572 file = fsencode(file)
573 path_list = map(fsencode, path_list)
574 for dir in path_list:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000575 fullname = path.join(dir, file)
576 try:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000577 exec_func(fullname, *argrest)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200578 except OSError as e:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000579 last_exc = e
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000580 tb = sys.exc_info()[2]
Christian Heimes45f9af32007-11-27 21:50:00 +0000581 if (e.errno != errno.ENOENT and e.errno != errno.ENOTDIR
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000582 and saved_exc is None):
583 saved_exc = e
584 saved_tb = tb
585 if saved_exc:
Benjamin Peterson4b068192009-02-20 03:19:25 +0000586 raise saved_exc.with_traceback(saved_tb)
587 raise last_exc.with_traceback(tb)
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000588
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000589
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000590def get_exec_path(env=None):
591 """Returns the sequence of directories that will be searched for the
592 named executable (similar to a shell) when launching a process.
593
594 *env* must be an environment variable dict or None. If *env* is None,
595 os.environ will be used.
596 """
Victor Stinner273b7662010-11-06 12:59:33 +0000597 # Use a local import instead of a global import to limit the number of
598 # modules loaded at startup: the os module is always loaded at startup by
599 # Python. It may also avoid a bootstrap issue.
Victor Stinner6f35eda2010-10-29 00:38:58 +0000600 import warnings
601
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000602 if env is None:
603 env = environ
Victor Stinnerb745a742010-05-18 17:17:23 +0000604
Victor Stinnerbb4f2182010-11-07 15:43:39 +0000605 # {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a
606 # BytesWarning when using python -b or python -bb: ignore the warning
Victor Stinner273b7662010-11-06 12:59:33 +0000607 with warnings.catch_warnings():
608 warnings.simplefilter("ignore", BytesWarning)
Victor Stinnerb745a742010-05-18 17:17:23 +0000609
Victor Stinnerb745a742010-05-18 17:17:23 +0000610 try:
Victor Stinner273b7662010-11-06 12:59:33 +0000611 path_list = env.get('PATH')
612 except TypeError:
613 path_list = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000614
Victor Stinner273b7662010-11-06 12:59:33 +0000615 if supports_bytes_environ:
616 try:
617 path_listb = env[b'PATH']
618 except (KeyError, TypeError):
619 pass
620 else:
621 if path_list is not None:
622 raise ValueError(
623 "env cannot contain 'PATH' and b'PATH' keys")
624 path_list = path_listb
625
626 if path_list is not None and isinstance(path_list, bytes):
627 path_list = fsdecode(path_list)
Victor Stinnerb745a742010-05-18 17:17:23 +0000628
629 if path_list is None:
630 path_list = defpath
631 return path_list.split(pathsep)
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000632
633
Skip Montanaro289bc052007-08-17 02:30:27 +0000634# Change environ to automatically call putenv(), unsetenv if they exist.
Raymond Hettinger158c9c22011-02-22 00:41:50 +0000635from collections.abc import MutableMapping
Skip Montanaro289bc052007-08-17 02:30:27 +0000636
637class _Environ(MutableMapping):
Victor Stinner84ae1182010-05-06 22:05:07 +0000638 def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv):
639 self.encodekey = encodekey
640 self.decodekey = decodekey
641 self.encodevalue = encodevalue
642 self.decodevalue = decodevalue
Skip Montanaro289bc052007-08-17 02:30:27 +0000643 self.putenv = putenv
644 self.unsetenv = unsetenv
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000645 self._data = data
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000646
Skip Montanaro289bc052007-08-17 02:30:27 +0000647 def __getitem__(self, key):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000648 value = self._data[self.encodekey(key)]
Victor Stinner84ae1182010-05-06 22:05:07 +0000649 return self.decodevalue(value)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000650
Skip Montanaro289bc052007-08-17 02:30:27 +0000651 def __setitem__(self, key, value):
Victor Stinner84ae1182010-05-06 22:05:07 +0000652 key = self.encodekey(key)
653 value = self.encodevalue(value)
Skip Montanaro289bc052007-08-17 02:30:27 +0000654 self.putenv(key, value)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000655 self._data[key] = value
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000656
Skip Montanaro289bc052007-08-17 02:30:27 +0000657 def __delitem__(self, key):
Victor Stinner84ae1182010-05-06 22:05:07 +0000658 key = self.encodekey(key)
Skip Montanaro289bc052007-08-17 02:30:27 +0000659 self.unsetenv(key)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000660 del self._data[key]
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000661
Skip Montanaro289bc052007-08-17 02:30:27 +0000662 def __iter__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000663 for key in self._data:
Victor Stinner84ae1182010-05-06 22:05:07 +0000664 yield self.decodekey(key)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000665
Skip Montanaro289bc052007-08-17 02:30:27 +0000666 def __len__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000667 return len(self._data)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000668
669 def __repr__(self):
Victor Stinnerbed71172010-07-28 21:25:42 +0000670 return 'environ({{{}}})'.format(', '.join(
Victor Stinnerd73c1a32010-07-28 21:23:23 +0000671 ('{!r}: {!r}'.format(self.decodekey(key), self.decodevalue(value))
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000672 for key, value in self._data.items())))
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000673
Skip Montanaro289bc052007-08-17 02:30:27 +0000674 def copy(self):
675 return dict(self)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000676
Skip Montanaro289bc052007-08-17 02:30:27 +0000677 def setdefault(self, key, value):
678 if key not in self:
679 self[key] = value
680 return self[key]
681
682try:
683 _putenv = putenv
684except NameError:
685 _putenv = lambda key, value: None
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000686else:
Skip Montanaro289bc052007-08-17 02:30:27 +0000687 __all__.append("putenv")
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000688
Skip Montanaro289bc052007-08-17 02:30:27 +0000689try:
690 _unsetenv = unsetenv
691except NameError:
692 _unsetenv = lambda key: _putenv(key, "")
693else:
694 __all__.append("unsetenv")
Guido van Rossumc524d952001-10-19 01:31:59 +0000695
Victor Stinner84ae1182010-05-06 22:05:07 +0000696def _createenviron():
Jesus Cea4791a242012-10-05 03:15:39 +0200697 if name == 'nt':
Victor Stinner84ae1182010-05-06 22:05:07 +0000698 # Where Env Var Names Must Be UPPERCASE
699 def check_str(value):
700 if not isinstance(value, str):
701 raise TypeError("str expected, not %s" % type(value).__name__)
702 return value
703 encode = check_str
704 decode = str
705 def encodekey(key):
706 return encode(key).upper()
707 data = {}
708 for key, value in environ.items():
709 data[encodekey(key)] = value
710 else:
711 # Where Env Var Names Can Be Mixed Case
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000712 encoding = sys.getfilesystemencoding()
Victor Stinner84ae1182010-05-06 22:05:07 +0000713 def encode(value):
714 if not isinstance(value, str):
715 raise TypeError("str expected, not %s" % type(value).__name__)
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000716 return value.encode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000717 def decode(value):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000718 return value.decode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000719 encodekey = encode
720 data = environ
721 return _Environ(data,
722 encodekey, decode,
723 encode, decode,
724 _putenv, _unsetenv)
Guido van Rossumc524d952001-10-19 01:31:59 +0000725
Victor Stinner84ae1182010-05-06 22:05:07 +0000726# unicode environ
727environ = _createenviron()
728del _createenviron
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000729
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000730
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000731def getenv(key, default=None):
Tim Peters2c60f7a2003-01-29 03:49:43 +0000732 """Get an environment variable, return None if it doesn't exist.
Victor Stinner84ae1182010-05-06 22:05:07 +0000733 The optional second argument can specify an alternate default.
734 key, default and the result are str."""
Tim Peters2c60f7a2003-01-29 03:49:43 +0000735 return environ.get(key, default)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000736
Jesus Cea4791a242012-10-05 03:15:39 +0200737supports_bytes_environ = (name != 'nt')
Victor Stinnerb745a742010-05-18 17:17:23 +0000738__all__.extend(("getenv", "supports_bytes_environ"))
739
740if supports_bytes_environ:
Victor Stinner84ae1182010-05-06 22:05:07 +0000741 def _check_bytes(value):
742 if not isinstance(value, bytes):
743 raise TypeError("bytes expected, not %s" % type(value).__name__)
744 return value
745
746 # bytes environ
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000747 environb = _Environ(environ._data,
Victor Stinner84ae1182010-05-06 22:05:07 +0000748 _check_bytes, bytes,
749 _check_bytes, bytes,
750 _putenv, _unsetenv)
751 del _check_bytes
752
753 def getenvb(key, default=None):
754 """Get an environment variable, return None if it doesn't exist.
755 The optional second argument can specify an alternate default.
756 key, default and the result are bytes."""
757 return environb.get(key, default)
Victor Stinner70120e22010-07-29 17:19:38 +0000758
759 __all__.extend(("environb", "getenvb"))
Victor Stinner84ae1182010-05-06 22:05:07 +0000760
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000761def _fscodec():
762 encoding = sys.getfilesystemencoding()
763 if encoding == 'mbcs':
Victor Stinnere882aac2010-10-24 21:12:26 +0000764 errors = 'strict'
Victor Stinner313a1202010-06-11 23:56:51 +0000765 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000766 errors = 'surrogateescape'
Victor Stinnere8d51452010-08-19 01:05:19 +0000767
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000768 def fsencode(filename):
769 """
770 Encode filename to the filesystem encoding with 'surrogateescape' error
771 handler, return bytes unchanged. On Windows, use 'strict' error handler if
772 the file system encoding is 'mbcs' (which is the default encoding).
773 """
774 if isinstance(filename, bytes):
775 return filename
776 elif isinstance(filename, str):
777 return filename.encode(encoding, errors)
Victor Stinnere8d51452010-08-19 01:05:19 +0000778 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000779 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
780
781 def fsdecode(filename):
782 """
783 Decode filename from the filesystem encoding with 'surrogateescape' error
784 handler, return str unchanged. On Windows, use 'strict' error handler if
785 the file system encoding is 'mbcs' (which is the default encoding).
786 """
787 if isinstance(filename, str):
788 return filename
789 elif isinstance(filename, bytes):
790 return filename.decode(encoding, errors)
791 else:
792 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
793
794 return fsencode, fsdecode
795
796fsencode, fsdecode = _fscodec()
797del _fscodec
Victor Stinner449c4662010-05-08 11:10:09 +0000798
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000799# Supply spawn*() (probably only for Unix)
800if _exists("fork") and not _exists("spawnv") and _exists("execv"):
801
802 P_WAIT = 0
803 P_NOWAIT = P_NOWAITO = 1
804
Petri Lehtinen3bc37f22012-05-23 21:36:16 +0300805 __all__.extend(["P_WAIT", "P_NOWAIT", "P_NOWAITO"])
806
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000807 # XXX Should we support P_DETACH? I suppose it could fork()**2
808 # and close the std I/O streams. Also, P_OVERLAY is the same
809 # as execv*()?
810
811 def _spawnvef(mode, file, args, env, func):
812 # Internal helper; func is the exec*() function to use
813 pid = fork()
814 if not pid:
815 # Child
816 try:
817 if env is None:
818 func(file, args)
819 else:
820 func(file, args, env)
821 except:
822 _exit(127)
823 else:
824 # Parent
825 if mode == P_NOWAIT:
826 return pid # Caller is responsible for waiting!
827 while 1:
828 wpid, sts = waitpid(pid, 0)
829 if WIFSTOPPED(sts):
830 continue
831 elif WIFSIGNALED(sts):
832 return -WTERMSIG(sts)
833 elif WIFEXITED(sts):
834 return WEXITSTATUS(sts)
835 else:
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200836 raise OSError("Not stopped, signaled or exited???")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000837
838 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000839 """spawnv(mode, file, args) -> integer
840
841Execute file with arguments from args in a subprocess.
842If mode == P_NOWAIT return the pid of the process.
843If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000844otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000845 return _spawnvef(mode, file, args, None, execv)
846
847 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000848 """spawnve(mode, file, args, env) -> integer
849
850Execute file with arguments from args in a subprocess with the
851specified environment.
852If mode == P_NOWAIT return the pid of the process.
853If mode == P_WAIT return the process's exit code if it exits normally;
854otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000855 return _spawnvef(mode, file, args, env, execve)
856
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000857 # Note: spawnvp[e] is't currently supported on Windows
858
859 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000860 """spawnvp(mode, file, args) -> integer
861
862Execute file (which is looked for along $PATH) with arguments from
863args in a subprocess.
864If mode == P_NOWAIT return the pid of the process.
865If mode == P_WAIT return the process's exit code if it exits normally;
866otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000867 return _spawnvef(mode, file, args, None, execvp)
868
869 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000870 """spawnvpe(mode, file, args, env) -> integer
871
872Execute file (which is looked for along $PATH) with arguments from
873args in a subprocess with the supplied environment.
874If mode == P_NOWAIT return the pid of the process.
875If mode == P_WAIT return the process's exit code if it exits normally;
876otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000877 return _spawnvef(mode, file, args, env, execvpe)
878
879if _exists("spawnv"):
880 # These aren't supplied by the basic Windows code
881 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000882
883 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000884 """spawnl(mode, file, *args) -> integer
885
886Execute file with arguments from args in a subprocess.
887If mode == P_NOWAIT return the pid of the process.
888If mode == P_WAIT return the process's exit code if it exits normally;
889otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000890 return spawnv(mode, file, args)
891
892 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000893 """spawnle(mode, file, *args, env) -> integer
894
895Execute file with arguments from args in a subprocess with the
896supplied environment.
897If mode == P_NOWAIT return the pid of the process.
898If mode == P_WAIT return the process's exit code if it exits normally;
899otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000900 env = args[-1]
901 return spawnve(mode, file, args[:-1], env)
902
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000903
904 __all__.extend(["spawnv", "spawnve", "spawnl", "spawnle",])
905
906
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000907if _exists("spawnvp"):
908 # At the moment, Windows doesn't implement spawnvp[e],
909 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000910 def spawnlp(mode, file, *args):
Neal Norwitzb7f68102003-07-02 02:49:33 +0000911 """spawnlp(mode, file, *args) -> integer
Guido van Rossume0cd2912000-04-21 18:35:36 +0000912
913Execute file (which is looked for along $PATH) with arguments from
914args in a subprocess with the supplied environment.
915If mode == P_NOWAIT return the pid of the process.
916If mode == P_WAIT return the process's exit code if it exits normally;
917otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000918 return spawnvp(mode, file, args)
919
920 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000921 """spawnlpe(mode, file, *args, env) -> integer
922
923Execute file (which is looked for along $PATH) with arguments from
924args in a subprocess with the supplied environment.
925If mode == P_NOWAIT return the pid of the process.
926If mode == P_WAIT return the process's exit code if it exits normally;
927otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000928 env = args[-1]
929 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000930
931
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000932 __all__.extend(["spawnvp", "spawnvpe", "spawnlp", "spawnlpe",])
Skip Montanaro269b83b2001-02-06 01:07:02 +0000933
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000934import copyreg as _copyreg
Michael W. Hudson0e025302002-03-06 17:11:18 +0000935
936def _make_stat_result(tup, dict):
937 return stat_result(tup, dict)
938
939def _pickle_stat_result(sr):
940 (type, args) = sr.__reduce__()
941 return (_make_stat_result, args)
942
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000943try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000944 _copyreg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000945except NameError: # stat_result may not exist
946 pass
Michael W. Hudson0e025302002-03-06 17:11:18 +0000947
948def _make_statvfs_result(tup, dict):
949 return statvfs_result(tup, dict)
950
951def _pickle_statvfs_result(sr):
952 (type, args) = sr.__reduce__()
953 return (_make_statvfs_result, args)
954
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000955try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000956 _copyreg.pickle(statvfs_result, _pickle_statvfs_result,
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000957 _make_statvfs_result)
Michael W. Hudsone5363b72002-03-15 10:21:59 +0000958except NameError: # statvfs_result may not exist
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000959 pass
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000960
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000961# Supply os.popen()
Antoine Pitrou877766d2011-03-19 17:00:37 +0100962def popen(cmd, mode="r", buffering=-1):
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000963 if not isinstance(cmd, str):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000964 raise TypeError("invalid cmd type (%s, expected string)" % type(cmd))
965 if mode not in ("r", "w"):
966 raise ValueError("invalid mode %r" % mode)
Benjamin Petersonb29614e2012-10-09 11:16:03 -0400967 if buffering == 0 or buffering is None:
Antoine Pitrou877766d2011-03-19 17:00:37 +0100968 raise ValueError("popen() does not support unbuffered streams")
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000969 import subprocess, io
970 if mode == "r":
971 proc = subprocess.Popen(cmd,
972 shell=True,
973 stdout=subprocess.PIPE,
974 bufsize=buffering)
975 return _wrap_close(io.TextIOWrapper(proc.stdout), proc)
976 else:
977 proc = subprocess.Popen(cmd,
978 shell=True,
979 stdin=subprocess.PIPE,
980 bufsize=buffering)
981 return _wrap_close(io.TextIOWrapper(proc.stdin), proc)
982
983# Helper for popen() -- a proxy for a file whose close waits for the process
984class _wrap_close:
985 def __init__(self, stream, proc):
986 self._stream = stream
987 self._proc = proc
988 def close(self):
989 self._stream.close()
Amaury Forgeot d'Arc97e5f282009-07-11 09:35:13 +0000990 returncode = self._proc.wait()
991 if returncode == 0:
992 return None
993 if name == 'nt':
994 return returncode
995 else:
996 return returncode << 8 # Shift left to match old behavior
Antoine Pitrouac625352009-12-09 00:01:27 +0000997 def __enter__(self):
998 return self
999 def __exit__(self, *args):
1000 self.close()
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001001 def __getattr__(self, name):
1002 return getattr(self._stream, name)
Thomas Heller476157b2007-09-04 11:27:47 +00001003 def __iter__(self):
1004 return iter(self._stream)
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001005
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +00001006# Supply os.fdopen()
1007def fdopen(fd, *args, **kwargs):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001008 if not isinstance(fd, int):
1009 raise TypeError("invalid fd type (%s, expected integer)" % type(fd))
1010 import io
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +00001011 return io.open(fd, *args, **kwargs)