blob: b5ad1b515dd60bd2ea8740a446419f5b882ef973 [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:
Alexandre Vassalottieca20b62008-05-16 02:54:33 +00004 - all functions from posix, nt, os2, or ce, e.g. unlink, stat, etc.
5 - os.path is either posixpath or ntpath
6 - os.name is either 'posix', 'nt', 'os2' 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 Rossum8e9ebfd1997-11-22 21:53:48 +000084elif 'os2' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000085 name = 'os2'
Guido van Rossume9387ea1998-05-22 15:26:04 +000086 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000087 from os2 import *
88 try:
89 from os2 import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030090 __all__.append('_exit')
Guido van Rossum61de0ac1997-12-05 21:24:30 +000091 except ImportError:
92 pass
Andrew MacIntyre5cef5712002-02-24 05:32:32 +000093 if sys.version.find('EMX GCC') == -1:
Skip Montanaro117910d2003-02-14 19:35:31 +000094 import ntpath as path
Andrew MacIntyre5cef5712002-02-24 05:32:32 +000095 else:
Skip Montanaro117910d2003-02-14 19:35:31 +000096 import os2emxpath as path
Andrew MacIntyre89f98652003-12-02 12:33:01 +000097 from _emx_link import link
Tim Petersf2715e02003-02-19 02:35:07 +000098
Skip Montanaro269b83b2001-02-06 01:07:02 +000099 import os2
100 __all__.extend(_get_exports_list(os2))
101 del os2
102
Larry Hastings9cf065c2012-06-22 16:30:09 -0700103 try:
104 from os2 import _have_functions
105 except ImportError:
106 pass
107
Guido van Rossum18df5d41999-06-11 01:37:27 +0000108elif 'ce' in _names:
109 name = 'ce'
110 linesep = '\r\n'
Guido van Rossum18df5d41999-06-11 01:37:27 +0000111 from ce import *
Tim Peters6757c1e2003-01-08 21:20:57 +0000112 try:
113 from ce import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +0300114 __all__.append('_exit')
Tim Peters6757c1e2003-01-08 21:20:57 +0000115 except ImportError:
116 pass
Guido van Rossum18df5d41999-06-11 01:37:27 +0000117 # We can use the standard Windows path.
Skip Montanaro117910d2003-02-14 19:35:31 +0000118 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +0000119
Skip Montanaro269b83b2001-02-06 01:07:02 +0000120 import ce
121 __all__.extend(_get_exports_list(ce))
122 del ce
123
Larry Hastings9cf065c2012-06-22 16:30:09 -0700124 try:
125 from ce import _have_functions
126 except ImportError:
127 pass
128
Guido van Rossum2979b011994-08-01 11:18:30 +0000129else:
Collin Winter828f04a2007-08-31 00:04:24 +0000130 raise ImportError('no os specific module found')
Guido van Rossume65cce51993-11-08 15:05:21 +0000131
Skip Montanaro117910d2003-02-14 19:35:31 +0000132sys.modules['os.path'] = path
Georg Brandled5b9b32008-12-05 07:45:54 +0000133from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep,
134 devnull)
Skip Montanaro269b83b2001-02-06 01:07:02 +0000135
Guido van Rossuma28dab51997-08-29 22:36:47 +0000136del _names
137
Larry Hastings9cf065c2012-06-22 16:30:09 -0700138
139if _exists("_have_functions"):
140 _globals = globals()
141 def _add(str, fn):
142 if (fn in _globals) and (str in _have_functions):
143 _set.add(_globals[fn])
144
145 _set = set()
146 _add("HAVE_FACCESSAT", "access")
147 _add("HAVE_FCHMODAT", "chmod")
148 _add("HAVE_FCHOWNAT", "chown")
149 _add("HAVE_FSTATAT", "stat")
150 _add("HAVE_FUTIMESAT", "utime")
151 _add("HAVE_LINKAT", "link")
152 _add("HAVE_MKDIRAT", "mkdir")
153 _add("HAVE_MKFIFOAT", "mkfifo")
154 _add("HAVE_MKNODAT", "mknod")
155 _add("HAVE_OPENAT", "open")
156 _add("HAVE_READLINKAT", "readlink")
157 _add("HAVE_RENAMEAT", "rename")
158 _add("HAVE_SYMLINKAT", "symlink")
159 _add("HAVE_UNLINKAT", "unlink")
160 _add("HAVE_UTIMENSAT", "utime")
161 supports_dir_fd = _set
162
163 _set = set()
164 _add("HAVE_FACCESSAT", "access")
165 supports_effective_ids = _set
166
167 _set = set()
168 _add("HAVE_FCHDIR", "chdir")
169 _add("HAVE_FCHMOD", "chmod")
170 _add("HAVE_FCHOWN", "chown")
171 _add("HAVE_FDOPENDIR", "listdir")
172 _add("HAVE_FEXECVE", "execve")
173 _set.add(stat) # fstat always works
174 _add("HAVE_FUTIMENS", "utime")
175 _add("HAVE_FUTIMES", "utime")
176 if _exists("statvfs") and _exists("fstatvfs"): # mac os x10.3
177 _add("HAVE_FSTATVFS", "statvfs")
178 supports_fd = _set
179
180 _set = set()
181 _add("HAVE_FACCESSAT", "access")
Larry Hastingsdbbc0c82012-06-22 19:50:21 -0700182 # Some platforms don't support lchmod(). Often the function exists
183 # anyway, as a stub that always returns ENOSUP or perhaps EOPNOTSUPP.
184 # (No, I don't know why that's a good design.) ./configure will detect
185 # this and reject it--so HAVE_LCHMOD still won't be defined on such
186 # platforms. This is Very Helpful.
187 #
188 # However, sometimes platforms without a working lchmod() *do* have
189 # fchmodat(). (Examples: Linux kernel 3.2 with glibc 2.15,
190 # OpenIndiana 3.x.) And fchmodat() has a flag that theoretically makes
191 # it behave like lchmod(). So in theory it would be a suitable
192 # replacement for lchmod(). But when lchmod() doesn't work, fchmodat()'s
193 # flag doesn't work *either*. Sadly ./configure isn't sophisticated
194 # enough to detect this condition--it only determines whether or not
195 # fchmodat() minimally works.
196 #
197 # Therefore we simply ignore fchmodat() when deciding whether or not
198 # os.chmod supports follow_symlinks. Just checking lchmod() is
199 # sufficient. After all--if you have a working fchmodat(), your
200 # lchmod() almost certainly works too.
201 #
202 # _add("HAVE_FCHMODAT", "chmod")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700203 _add("HAVE_FCHOWNAT", "chown")
204 _add("HAVE_FSTATAT", "stat")
205 _add("HAVE_LCHFLAGS", "chflags")
206 _add("HAVE_LCHMOD", "chmod")
207 if _exists("lchown"): # mac os x10.3
208 _add("HAVE_LCHOWN", "chown")
209 _add("HAVE_LINKAT", "link")
210 _add("HAVE_LUTIMES", "utime")
211 _add("HAVE_LSTAT", "stat")
212 _add("HAVE_FSTATAT", "stat")
213 _add("HAVE_UTIMENSAT", "utime")
214 _add("MS_WINDOWS", "stat")
215 supports_follow_symlinks = _set
216
217 _set = set()
218 _add("HAVE_UNLINKAT", "unlink")
219 supports_remove_directory = _set
220
221 del _set
222 del _have_functions
223 del _globals
224 del _add
225
226
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000227# Python uses fixed values for the SEEK_ constants; they are mapped
228# to native constants if necessary in posixmodule.c
Jesus Cea94363612012-06-22 18:32:07 +0200229# Other possible SEEK values are directly imported from posixmodule.c
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000230SEEK_SET = 0
231SEEK_CUR = 1
232SEEK_END = 2
233
Terry Reedy5a22b652010-12-02 07:05:56 +0000234
235def _get_masked_mode(mode):
236 mask = umask(0)
237 umask(mask)
238 return mode & ~mask
239
Guido van Rossum4def7de1998-07-24 20:48:03 +0000240# Super directory utilities.
241# (Inspired by Eric Raymond; the doc strings are mostly his)
242
Terry Reedy5a22b652010-12-02 07:05:56 +0000243def makedirs(name, mode=0o777, exist_ok=False):
244 """makedirs(path [, mode=0o777][, exist_ok=False])
Guido van Rossum4def7de1998-07-24 20:48:03 +0000245
246 Super-mkdir; create a leaf directory and all intermediate ones.
247 Works like mkdir, except that any intermediate path segment (not
Terry Reedy5a22b652010-12-02 07:05:56 +0000248 just the rightmost) will be created if it does not exist. If the
249 target directory with the same mode as we specified already exists,
250 raises an OSError if exist_ok is False, otherwise no exception is
251 raised. This is recursive.
Guido van Rossum4def7de1998-07-24 20:48:03 +0000252
253 """
254 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000255 if not tail:
256 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000257 if head and tail and not path.exists(head):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000258 try:
Terry Reedy5a22b652010-12-02 07:05:56 +0000259 makedirs(head, mode, exist_ok)
Guido van Rossumb940e112007-01-10 16:19:56 +0000260 except OSError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000261 # be happy if someone already created the path
Christian Heimes45f9af32007-11-27 21:50:00 +0000262 if e.errno != errno.EEXIST:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000263 raise
Andrew M. Kuchling6fccc8a2003-12-23 16:33:28 +0000264 if tail == curdir: # xxx/newdir/. exists if xxx/newdir exists
265 return
Terry Reedy5a22b652010-12-02 07:05:56 +0000266 try:
267 mkdir(name, mode)
268 except OSError as e:
Gregory P. Smitha81c8562012-06-03 14:30:44 -0700269 dir_exists = path.isdir(name)
270 expected_mode = _get_masked_mode(mode)
271 if dir_exists:
272 # S_ISGID is automatically copied by the OS from parent to child
273 # directories on mkdir. Don't consider it being set to be a mode
274 # mismatch as mkdir does not unset it when not specified in mode.
275 actual_mode = st.S_IMODE(lstat(name).st_mode) & ~st.S_ISGID
276 else:
277 actual_mode = -1
278 if not (e.errno == errno.EEXIST and exist_ok and dir_exists and
279 actual_mode == expected_mode):
280 if dir_exists and actual_mode != expected_mode:
281 e.strerror += ' (mode %o != expected mode %o)' % (
282 actual_mode, expected_mode)
Terry Reedy5a22b652010-12-02 07:05:56 +0000283 raise
Guido van Rossum4def7de1998-07-24 20:48:03 +0000284
285def removedirs(name):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000286 """removedirs(path)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000287
Fredrik Lundh96c1c7a2005-11-12 15:55:04 +0000288 Super-rmdir; remove a leaf directory and all empty intermediate
Guido van Rossum4def7de1998-07-24 20:48:03 +0000289 ones. Works like rmdir except that, if the leaf directory is
290 successfully removed, directories corresponding to rightmost path
Tim Petersc4e09402003-04-25 07:11:48 +0000291 segments will be pruned away until either the whole path is
Guido van Rossum4def7de1998-07-24 20:48:03 +0000292 consumed or an error occurs. Errors during this latter phase are
293 ignored -- they generally mean that a directory was not empty.
294
295 """
296 rmdir(name)
297 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000298 if not tail:
299 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000300 while head and tail:
301 try:
302 rmdir(head)
303 except error:
304 break
305 head, tail = path.split(head)
306
307def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000308 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000309
310 Super-rename; create directories as necessary and delete any left
311 empty. Works like rename, except creation of any intermediate
312 directories needed to make the new pathname good is attempted
313 first. After the rename, directories corresponding to rightmost
314 path segments of the old name will be pruned way until either the
315 whole path is consumed or a nonempty directory is found.
316
317 Note: this function can fail with the new directory structure made
318 if you lack permissions needed to unlink the leaf directory or
319 file.
320
321 """
322 head, tail = path.split(new)
323 if head and tail and not path.exists(head):
324 makedirs(head)
325 rename(old, new)
326 head, tail = path.split(old)
327 if head and tail:
328 try:
329 removedirs(head)
330 except error:
331 pass
332
Skip Montanaro269b83b2001-02-06 01:07:02 +0000333__all__.extend(["makedirs", "removedirs", "renames"])
334
Guido van Rossumd8faa362007-04-27 19:54:29 +0000335def walk(top, topdown=True, onerror=None, followlinks=False):
Tim Petersc4e09402003-04-25 07:11:48 +0000336 """Directory tree generator.
337
338 For each directory in the directory tree rooted at top (including top
339 itself, but excluding '.' and '..'), yields a 3-tuple
340
341 dirpath, dirnames, filenames
342
343 dirpath is a string, the path to the directory. dirnames is a list of
344 the names of the subdirectories in dirpath (excluding '.' and '..').
345 filenames is a list of the names of the non-directory files in dirpath.
346 Note that the names in the lists are just names, with no path components.
347 To get a full path (which begins with top) to a file or directory in
348 dirpath, do os.path.join(dirpath, name).
349
350 If optional arg 'topdown' is true or not specified, the triple for a
351 directory is generated before the triples for any of its subdirectories
352 (directories are generated top down). If topdown is false, the triple
353 for a directory is generated after the triples for all of its
354 subdirectories (directories are generated bottom up).
355
356 When topdown is true, the caller can modify the dirnames list in-place
357 (e.g., via del or slice assignment), and walk will only recurse into the
358 subdirectories whose names remain in dirnames; this can be used to prune
359 the search, or to impose a specific order of visiting. Modifying
360 dirnames when topdown is false is ineffective, since the directories in
361 dirnames have already been generated by the time dirnames itself is
362 generated.
363
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000364 By default errors from the os.listdir() call are ignored. If
365 optional arg 'onerror' is specified, it should be a function; it
366 will be called with one argument, an os.error instance. It can
367 report the error to continue with the walk, or raise the exception
368 to abort the walk. Note that the filename is available as the
369 filename attribute of the exception object.
370
Guido van Rossumd8faa362007-04-27 19:54:29 +0000371 By default, os.walk does not follow symbolic links to subdirectories on
372 systems that support them. In order to get this functionality, set the
373 optional argument 'followlinks' to true.
374
Tim Petersc4e09402003-04-25 07:11:48 +0000375 Caution: if you pass a relative pathname for top, don't change the
376 current working directory between resumptions of walk. walk never
377 changes the current directory, and assumes that the client doesn't
378 either.
379
380 Example:
381
Christian Heimes5d8da202008-05-06 13:58:24 +0000382 import os
Tim Petersc4e09402003-04-25 07:11:48 +0000383 from os.path import join, getsize
Christian Heimes5d8da202008-05-06 13:58:24 +0000384 for root, dirs, files in os.walk('python/Lib/email'):
Neal Norwitz752abd02008-05-13 04:55:24 +0000385 print(root, "consumes", end="")
386 print(sum([getsize(join(root, name)) for name in files]), end="")
387 print("bytes in", len(files), "non-directory files")
Tim Petersc4e09402003-04-25 07:11:48 +0000388 if 'CVS' in dirs:
389 dirs.remove('CVS') # don't visit CVS directories
390 """
391
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000392 islink, join, isdir = path.islink, path.join, path.isdir
Tim Petersc4e09402003-04-25 07:11:48 +0000393
394 # We may not have read permission for top, in which case we can't
Alexandre Vassalotti4e6531e2008-05-09 20:00:17 +0000395 # get a list of the files the directory contains. os.walk
Tim Petersc4e09402003-04-25 07:11:48 +0000396 # always suppressed the exception then, rather than blow up for a
397 # minor reason when (say) a thousand readable directories are still
398 # left to visit. That logic is copied here.
399 try:
400 # Note that listdir and error are globals in this module due
401 # to earlier import-*.
402 names = listdir(top)
Guido van Rossumb940e112007-01-10 16:19:56 +0000403 except error as err:
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000404 if onerror is not None:
405 onerror(err)
Tim Petersc4e09402003-04-25 07:11:48 +0000406 return
407
408 dirs, nondirs = [], []
409 for name in names:
410 if isdir(join(top, name)):
411 dirs.append(name)
412 else:
413 nondirs.append(name)
414
415 if topdown:
416 yield top, dirs, nondirs
417 for name in dirs:
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000418 new_path = join(top, name)
419 if followlinks or not islink(new_path):
Benjamin Peterson569d0872012-05-10 16:17:35 -0500420 yield from walk(new_path, topdown, onerror, followlinks)
Tim Petersc4e09402003-04-25 07:11:48 +0000421 if not topdown:
422 yield top, dirs, nondirs
423
424__all__.append("walk")
425
Larry Hastings9cf065c2012-06-22 16:30:09 -0700426if open in supports_dir_fd:
Charles-François Natali7372b062012-02-05 15:15:38 +0100427
428 def fwalk(top, topdown=True, onerror=None, followlinks=False):
429 """Directory tree generator.
430
431 This behaves exactly like walk(), except that it yields a 4-tuple
432
433 dirpath, dirnames, filenames, dirfd
434
435 `dirpath`, `dirnames` and `filenames` are identical to walk() output,
436 and `dirfd` is a file descriptor referring to the directory `dirpath`.
437
438 The advantage of walkfd() over walk() is that it's safe against symlink
439 races (when followlinks is False).
440
441 Caution:
442 Since fwalk() yields file descriptors, those are only valid until the
443 next iteration step, so you should dup() them if you want to keep them
444 for a longer period.
445
446 Example:
447
448 import os
449 for root, dirs, files, rootfd in os.fwalk('python/Lib/email'):
450 print(root, "consumes", end="")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700451 print(sum([os.stat(name, dir_fd=rootfd).st_size for name in files]),
Charles-François Natali7372b062012-02-05 15:15:38 +0100452 end="")
453 print("bytes in", len(files), "non-directory files")
454 if 'CVS' in dirs:
455 dirs.remove('CVS') # don't visit CVS directories
456 """
457 # Note: To guard against symlink races, we use the standard
458 # lstat()/open()/fstat() trick.
459 orig_st = lstat(top)
460 topfd = open(top, O_RDONLY)
461 try:
462 if (followlinks or (st.S_ISDIR(orig_st.st_mode) and
Charles-François Natali84c0ca02012-04-22 15:55:43 +0200463 path.samestat(orig_st, fstat(topfd)))):
Benjamin Peterson569d0872012-05-10 16:17:35 -0500464 yield from _fwalk(topfd, top, topdown, onerror, followlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100465 finally:
466 close(topfd)
467
468 def _fwalk(topfd, toppath, topdown, onerror, followlinks):
469 # Note: This uses O(depth of the directory tree) file descriptors: if
470 # necessary, it can be adapted to only require O(1) FDs, see issue
471 # #13734.
472
Larry Hastings9cf065c2012-06-22 16:30:09 -0700473 names = listdir(topfd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100474 dirs, nondirs = [], []
475 for name in names:
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200476 try:
477 # Here, we don't use AT_SYMLINK_NOFOLLOW to be consistent with
478 # walk() which reports symlinks to directories as directories.
479 # We do however check for symlinks before recursing into
480 # a subdirectory.
Larry Hastings9cf065c2012-06-22 16:30:09 -0700481 if st.S_ISDIR(stat(name, dir_fd=topfd).st_mode):
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200482 dirs.append(name)
483 else:
484 nondirs.append(name)
485 except FileNotFoundError:
486 try:
487 # Add dangling symlinks, ignore disappeared files
Larry Hastings9cf065c2012-06-22 16:30:09 -0700488 if st.S_ISLNK(stat(name, dir_fd=topfd, follow_symlinks=False)
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200489 .st_mode):
490 nondirs.append(name)
491 except FileNotFoundError:
492 continue
Charles-François Natali7372b062012-02-05 15:15:38 +0100493
494 if topdown:
495 yield toppath, dirs, nondirs, topfd
496
497 for name in dirs:
498 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700499 orig_st = stat(name, dir_fd=topfd, follow_symlinks=followlinks)
500 dirfd = open(name, O_RDONLY, dir_fd=topfd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100501 except error as err:
502 if onerror is not None:
503 onerror(err)
504 return
505 try:
Charles-François Natali84c0ca02012-04-22 15:55:43 +0200506 if followlinks or path.samestat(orig_st, fstat(dirfd)):
Charles-François Natali7372b062012-02-05 15:15:38 +0100507 dirpath = path.join(toppath, name)
Benjamin Peterson569d0872012-05-10 16:17:35 -0500508 yield from _fwalk(dirfd, dirpath, topdown, onerror, followlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100509 finally:
510 close(dirfd)
511
512 if not topdown:
513 yield toppath, dirs, nondirs, topfd
514
515 __all__.append("fwalk")
516
Guido van Rossuma28dab51997-08-29 22:36:47 +0000517# Make sure os.environ exists, at least
518try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000519 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000520except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000521 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000522
Guido van Rossume65cce51993-11-08 15:05:21 +0000523def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000524 """execl(file, *args)
525
526 Execute the executable file with argument list args, replacing the
527 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000528 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000529
530def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000531 """execle(file, *args, env)
532
533 Execute the executable file with argument list args and
534 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000535 env = args[-1]
536 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000537
538def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000539 """execlp(file, *args)
540
541 Execute the executable file (which is searched for along $PATH)
542 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000543 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000544
Guido van Rossum030afb11995-03-14 17:27:18 +0000545def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000546 """execlpe(file, *args, env)
547
548 Execute the executable file (which is searched for along $PATH)
549 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000550 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000551 env = args[-1]
552 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000553
Guido van Rossume65cce51993-11-08 15:05:21 +0000554def execvp(file, args):
Matthias Klosea09c54f2010-01-31 16:48:44 +0000555 """execvp(file, args)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000556
557 Execute the executable file (which is searched for along $PATH)
558 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000559 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000560 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000561
562def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000563 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000564
565 Execute the executable file (which is searched for along $PATH)
566 with argument list args and environment env , replacing the
567 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000568 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000569 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000570
Skip Montanaro269b83b2001-02-06 01:07:02 +0000571__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
572
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000573def _execvpe(file, args, env=None):
574 if env is not None:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000575 exec_func = execve
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000576 argrest = (args, env)
577 else:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000578 exec_func = execv
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000579 argrest = (args,)
580 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000581
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000582 head, tail = path.split(file)
583 if head:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000584 exec_func(file, *argrest)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000585 return
Guido van Rossume7ba4952007-06-06 23:52:48 +0000586 last_exc = saved_exc = None
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000587 saved_tb = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000588 path_list = get_exec_path(env)
589 if name != 'nt':
590 file = fsencode(file)
591 path_list = map(fsencode, path_list)
592 for dir in path_list:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000593 fullname = path.join(dir, file)
594 try:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000595 exec_func(fullname, *argrest)
Guido van Rossumb940e112007-01-10 16:19:56 +0000596 except error as e:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000597 last_exc = e
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000598 tb = sys.exc_info()[2]
Christian Heimes45f9af32007-11-27 21:50:00 +0000599 if (e.errno != errno.ENOENT and e.errno != errno.ENOTDIR
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000600 and saved_exc is None):
601 saved_exc = e
602 saved_tb = tb
603 if saved_exc:
Benjamin Peterson4b068192009-02-20 03:19:25 +0000604 raise saved_exc.with_traceback(saved_tb)
605 raise last_exc.with_traceback(tb)
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000606
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000607
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000608def get_exec_path(env=None):
609 """Returns the sequence of directories that will be searched for the
610 named executable (similar to a shell) when launching a process.
611
612 *env* must be an environment variable dict or None. If *env* is None,
613 os.environ will be used.
614 """
Victor Stinner273b7662010-11-06 12:59:33 +0000615 # Use a local import instead of a global import to limit the number of
616 # modules loaded at startup: the os module is always loaded at startup by
617 # Python. It may also avoid a bootstrap issue.
Victor Stinner6f35eda2010-10-29 00:38:58 +0000618 import warnings
619
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000620 if env is None:
621 env = environ
Victor Stinnerb745a742010-05-18 17:17:23 +0000622
Victor Stinnerbb4f2182010-11-07 15:43:39 +0000623 # {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a
624 # BytesWarning when using python -b or python -bb: ignore the warning
Victor Stinner273b7662010-11-06 12:59:33 +0000625 with warnings.catch_warnings():
626 warnings.simplefilter("ignore", BytesWarning)
Victor Stinnerb745a742010-05-18 17:17:23 +0000627
Victor Stinnerb745a742010-05-18 17:17:23 +0000628 try:
Victor Stinner273b7662010-11-06 12:59:33 +0000629 path_list = env.get('PATH')
630 except TypeError:
631 path_list = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000632
Victor Stinner273b7662010-11-06 12:59:33 +0000633 if supports_bytes_environ:
634 try:
635 path_listb = env[b'PATH']
636 except (KeyError, TypeError):
637 pass
638 else:
639 if path_list is not None:
640 raise ValueError(
641 "env cannot contain 'PATH' and b'PATH' keys")
642 path_list = path_listb
643
644 if path_list is not None and isinstance(path_list, bytes):
645 path_list = fsdecode(path_list)
Victor Stinnerb745a742010-05-18 17:17:23 +0000646
647 if path_list is None:
648 path_list = defpath
649 return path_list.split(pathsep)
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000650
651
Skip Montanaro289bc052007-08-17 02:30:27 +0000652# Change environ to automatically call putenv(), unsetenv if they exist.
Raymond Hettinger158c9c22011-02-22 00:41:50 +0000653from collections.abc import MutableMapping
Skip Montanaro289bc052007-08-17 02:30:27 +0000654
655class _Environ(MutableMapping):
Victor Stinner84ae1182010-05-06 22:05:07 +0000656 def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv):
657 self.encodekey = encodekey
658 self.decodekey = decodekey
659 self.encodevalue = encodevalue
660 self.decodevalue = decodevalue
Skip Montanaro289bc052007-08-17 02:30:27 +0000661 self.putenv = putenv
662 self.unsetenv = unsetenv
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000663 self._data = data
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000664
Skip Montanaro289bc052007-08-17 02:30:27 +0000665 def __getitem__(self, key):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000666 value = self._data[self.encodekey(key)]
Victor Stinner84ae1182010-05-06 22:05:07 +0000667 return self.decodevalue(value)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000668
Skip Montanaro289bc052007-08-17 02:30:27 +0000669 def __setitem__(self, key, value):
Victor Stinner84ae1182010-05-06 22:05:07 +0000670 key = self.encodekey(key)
671 value = self.encodevalue(value)
Skip Montanaro289bc052007-08-17 02:30:27 +0000672 self.putenv(key, value)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000673 self._data[key] = value
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000674
Skip Montanaro289bc052007-08-17 02:30:27 +0000675 def __delitem__(self, key):
Victor Stinner84ae1182010-05-06 22:05:07 +0000676 key = self.encodekey(key)
Skip Montanaro289bc052007-08-17 02:30:27 +0000677 self.unsetenv(key)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000678 del self._data[key]
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000679
Skip Montanaro289bc052007-08-17 02:30:27 +0000680 def __iter__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000681 for key in self._data:
Victor Stinner84ae1182010-05-06 22:05:07 +0000682 yield self.decodekey(key)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000683
Skip Montanaro289bc052007-08-17 02:30:27 +0000684 def __len__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000685 return len(self._data)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000686
687 def __repr__(self):
Victor Stinnerbed71172010-07-28 21:25:42 +0000688 return 'environ({{{}}})'.format(', '.join(
Victor Stinnerd73c1a32010-07-28 21:23:23 +0000689 ('{!r}: {!r}'.format(self.decodekey(key), self.decodevalue(value))
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000690 for key, value in self._data.items())))
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000691
Skip Montanaro289bc052007-08-17 02:30:27 +0000692 def copy(self):
693 return dict(self)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000694
Skip Montanaro289bc052007-08-17 02:30:27 +0000695 def setdefault(self, key, value):
696 if key not in self:
697 self[key] = value
698 return self[key]
699
700try:
701 _putenv = putenv
702except NameError:
703 _putenv = lambda key, value: None
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000704else:
Skip Montanaro289bc052007-08-17 02:30:27 +0000705 __all__.append("putenv")
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000706
Skip Montanaro289bc052007-08-17 02:30:27 +0000707try:
708 _unsetenv = unsetenv
709except NameError:
710 _unsetenv = lambda key: _putenv(key, "")
711else:
712 __all__.append("unsetenv")
Guido van Rossumc524d952001-10-19 01:31:59 +0000713
Victor Stinner84ae1182010-05-06 22:05:07 +0000714def _createenviron():
715 if name in ('os2', 'nt'):
716 # Where Env Var Names Must Be UPPERCASE
717 def check_str(value):
718 if not isinstance(value, str):
719 raise TypeError("str expected, not %s" % type(value).__name__)
720 return value
721 encode = check_str
722 decode = str
723 def encodekey(key):
724 return encode(key).upper()
725 data = {}
726 for key, value in environ.items():
727 data[encodekey(key)] = value
728 else:
729 # Where Env Var Names Can Be Mixed Case
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000730 encoding = sys.getfilesystemencoding()
Victor Stinner84ae1182010-05-06 22:05:07 +0000731 def encode(value):
732 if not isinstance(value, str):
733 raise TypeError("str expected, not %s" % type(value).__name__)
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000734 return value.encode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000735 def decode(value):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000736 return value.decode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000737 encodekey = encode
738 data = environ
739 return _Environ(data,
740 encodekey, decode,
741 encode, decode,
742 _putenv, _unsetenv)
Guido van Rossumc524d952001-10-19 01:31:59 +0000743
Victor Stinner84ae1182010-05-06 22:05:07 +0000744# unicode environ
745environ = _createenviron()
746del _createenviron
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000747
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000748
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000749def getenv(key, default=None):
Tim Peters2c60f7a2003-01-29 03:49:43 +0000750 """Get an environment variable, return None if it doesn't exist.
Victor Stinner84ae1182010-05-06 22:05:07 +0000751 The optional second argument can specify an alternate default.
752 key, default and the result are str."""
Tim Peters2c60f7a2003-01-29 03:49:43 +0000753 return environ.get(key, default)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000754
Victor Stinnerb745a742010-05-18 17:17:23 +0000755supports_bytes_environ = name not in ('os2', 'nt')
756__all__.extend(("getenv", "supports_bytes_environ"))
757
758if supports_bytes_environ:
Victor Stinner84ae1182010-05-06 22:05:07 +0000759 def _check_bytes(value):
760 if not isinstance(value, bytes):
761 raise TypeError("bytes expected, not %s" % type(value).__name__)
762 return value
763
764 # bytes environ
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000765 environb = _Environ(environ._data,
Victor Stinner84ae1182010-05-06 22:05:07 +0000766 _check_bytes, bytes,
767 _check_bytes, bytes,
768 _putenv, _unsetenv)
769 del _check_bytes
770
771 def getenvb(key, default=None):
772 """Get an environment variable, return None if it doesn't exist.
773 The optional second argument can specify an alternate default.
774 key, default and the result are bytes."""
775 return environb.get(key, default)
Victor Stinner70120e22010-07-29 17:19:38 +0000776
777 __all__.extend(("environb", "getenvb"))
Victor Stinner84ae1182010-05-06 22:05:07 +0000778
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000779def _fscodec():
780 encoding = sys.getfilesystemencoding()
781 if encoding == 'mbcs':
Victor Stinnere882aac2010-10-24 21:12:26 +0000782 errors = 'strict'
Victor Stinner313a1202010-06-11 23:56:51 +0000783 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000784 errors = 'surrogateescape'
Victor Stinnere8d51452010-08-19 01:05:19 +0000785
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000786 def fsencode(filename):
787 """
788 Encode filename to the filesystem encoding with 'surrogateescape' error
789 handler, return bytes unchanged. On Windows, use 'strict' error handler if
790 the file system encoding is 'mbcs' (which is the default encoding).
791 """
792 if isinstance(filename, bytes):
793 return filename
794 elif isinstance(filename, str):
795 return filename.encode(encoding, errors)
Victor Stinnere8d51452010-08-19 01:05:19 +0000796 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000797 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
798
799 def fsdecode(filename):
800 """
801 Decode filename from the filesystem encoding with 'surrogateescape' error
802 handler, return str unchanged. On Windows, use 'strict' error handler if
803 the file system encoding is 'mbcs' (which is the default encoding).
804 """
805 if isinstance(filename, str):
806 return filename
807 elif isinstance(filename, bytes):
808 return filename.decode(encoding, errors)
809 else:
810 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
811
812 return fsencode, fsdecode
813
814fsencode, fsdecode = _fscodec()
815del _fscodec
Victor Stinner449c4662010-05-08 11:10:09 +0000816
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000817# Supply spawn*() (probably only for Unix)
818if _exists("fork") and not _exists("spawnv") and _exists("execv"):
819
820 P_WAIT = 0
821 P_NOWAIT = P_NOWAITO = 1
822
Petri Lehtinen3bc37f22012-05-23 21:36:16 +0300823 __all__.extend(["P_WAIT", "P_NOWAIT", "P_NOWAITO"])
824
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000825 # XXX Should we support P_DETACH? I suppose it could fork()**2
826 # and close the std I/O streams. Also, P_OVERLAY is the same
827 # as execv*()?
828
829 def _spawnvef(mode, file, args, env, func):
830 # Internal helper; func is the exec*() function to use
831 pid = fork()
832 if not pid:
833 # Child
834 try:
835 if env is None:
836 func(file, args)
837 else:
838 func(file, args, env)
839 except:
840 _exit(127)
841 else:
842 # Parent
843 if mode == P_NOWAIT:
844 return pid # Caller is responsible for waiting!
845 while 1:
846 wpid, sts = waitpid(pid, 0)
847 if WIFSTOPPED(sts):
848 continue
849 elif WIFSIGNALED(sts):
850 return -WTERMSIG(sts)
851 elif WIFEXITED(sts):
852 return WEXITSTATUS(sts)
853 else:
Collin Winter828f04a2007-08-31 00:04:24 +0000854 raise error("Not stopped, signaled or exited???")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000855
856 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000857 """spawnv(mode, file, args) -> integer
858
859Execute file with arguments from args in a subprocess.
860If mode == P_NOWAIT return the pid of the process.
861If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000862otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000863 return _spawnvef(mode, file, args, None, execv)
864
865 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000866 """spawnve(mode, file, args, env) -> integer
867
868Execute file with arguments from args in a subprocess with the
869specified environment.
870If mode == P_NOWAIT return the pid of the process.
871If mode == P_WAIT return the process's exit code if it exits normally;
872otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000873 return _spawnvef(mode, file, args, env, execve)
874
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000875 # Note: spawnvp[e] is't currently supported on Windows
876
877 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000878 """spawnvp(mode, file, args) -> integer
879
880Execute file (which is looked for along $PATH) with arguments from
881args in a subprocess.
882If mode == P_NOWAIT return the pid of the process.
883If mode == P_WAIT return the process's exit code if it exits normally;
884otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000885 return _spawnvef(mode, file, args, None, execvp)
886
887 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000888 """spawnvpe(mode, file, args, env) -> integer
889
890Execute file (which is looked for along $PATH) with arguments from
891args in a subprocess with the supplied environment.
892If mode == P_NOWAIT return the pid of the process.
893If mode == P_WAIT return the process's exit code if it exits normally;
894otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000895 return _spawnvef(mode, file, args, env, execvpe)
896
897if _exists("spawnv"):
898 # These aren't supplied by the basic Windows code
899 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000900
901 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000902 """spawnl(mode, file, *args) -> integer
903
904Execute file with arguments from args in a subprocess.
905If mode == P_NOWAIT return the pid of the process.
906If mode == P_WAIT return the process's exit code if it exits normally;
907otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000908 return spawnv(mode, file, args)
909
910 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000911 """spawnle(mode, file, *args, env) -> integer
912
913Execute file with arguments from args in a subprocess with the
914supplied 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 env = args[-1]
919 return spawnve(mode, file, args[:-1], env)
920
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000921
922 __all__.extend(["spawnv", "spawnve", "spawnl", "spawnle",])
923
924
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000925if _exists("spawnvp"):
926 # At the moment, Windows doesn't implement spawnvp[e],
927 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000928 def spawnlp(mode, file, *args):
Neal Norwitzb7f68102003-07-02 02:49:33 +0000929 """spawnlp(mode, file, *args) -> integer
Guido van Rossume0cd2912000-04-21 18:35:36 +0000930
931Execute file (which is looked for along $PATH) with arguments from
932args in a subprocess with the supplied environment.
933If mode == P_NOWAIT return the pid of the process.
934If mode == P_WAIT return the process's exit code if it exits normally;
935otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000936 return spawnvp(mode, file, args)
937
938 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000939 """spawnlpe(mode, file, *args, env) -> integer
940
941Execute file (which is looked for along $PATH) with arguments from
942args in a subprocess with the supplied environment.
943If mode == P_NOWAIT return the pid of the process.
944If mode == P_WAIT return the process's exit code if it exits normally;
945otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000946 env = args[-1]
947 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000948
949
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000950 __all__.extend(["spawnvp", "spawnvpe", "spawnlp", "spawnlpe",])
Skip Montanaro269b83b2001-02-06 01:07:02 +0000951
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000952import copyreg as _copyreg
Michael W. Hudson0e025302002-03-06 17:11:18 +0000953
954def _make_stat_result(tup, dict):
955 return stat_result(tup, dict)
956
957def _pickle_stat_result(sr):
958 (type, args) = sr.__reduce__()
959 return (_make_stat_result, args)
960
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000961try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000962 _copyreg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000963except NameError: # stat_result may not exist
964 pass
Michael W. Hudson0e025302002-03-06 17:11:18 +0000965
966def _make_statvfs_result(tup, dict):
967 return statvfs_result(tup, dict)
968
969def _pickle_statvfs_result(sr):
970 (type, args) = sr.__reduce__()
971 return (_make_statvfs_result, args)
972
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000973try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000974 _copyreg.pickle(statvfs_result, _pickle_statvfs_result,
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000975 _make_statvfs_result)
Michael W. Hudsone5363b72002-03-15 10:21:59 +0000976except NameError: # statvfs_result may not exist
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000977 pass
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000978
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000979# Supply os.popen()
Antoine Pitrou877766d2011-03-19 17:00:37 +0100980def popen(cmd, mode="r", buffering=-1):
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000981 if not isinstance(cmd, str):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000982 raise TypeError("invalid cmd type (%s, expected string)" % type(cmd))
983 if mode not in ("r", "w"):
984 raise ValueError("invalid mode %r" % mode)
Antoine Pitrou877766d2011-03-19 17:00:37 +0100985 if buffering == 0 or buffering == None:
986 raise ValueError("popen() does not support unbuffered streams")
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000987 import subprocess, io
988 if mode == "r":
989 proc = subprocess.Popen(cmd,
990 shell=True,
991 stdout=subprocess.PIPE,
992 bufsize=buffering)
993 return _wrap_close(io.TextIOWrapper(proc.stdout), proc)
994 else:
995 proc = subprocess.Popen(cmd,
996 shell=True,
997 stdin=subprocess.PIPE,
998 bufsize=buffering)
999 return _wrap_close(io.TextIOWrapper(proc.stdin), proc)
1000
1001# Helper for popen() -- a proxy for a file whose close waits for the process
1002class _wrap_close:
1003 def __init__(self, stream, proc):
1004 self._stream = stream
1005 self._proc = proc
1006 def close(self):
1007 self._stream.close()
Amaury Forgeot d'Arc97e5f282009-07-11 09:35:13 +00001008 returncode = self._proc.wait()
1009 if returncode == 0:
1010 return None
1011 if name == 'nt':
1012 return returncode
1013 else:
1014 return returncode << 8 # Shift left to match old behavior
Antoine Pitrouac625352009-12-09 00:01:27 +00001015 def __enter__(self):
1016 return self
1017 def __exit__(self, *args):
1018 self.close()
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001019 def __getattr__(self, name):
1020 return getattr(self._stream, name)
Thomas Heller476157b2007-09-04 11:27:47 +00001021 def __iter__(self):
1022 return iter(self._stream)
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001023
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +00001024# Supply os.fdopen()
1025def fdopen(fd, *args, **kwargs):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001026 if not isinstance(fd, int):
1027 raise TypeError("invalid fd type (%s, expected integer)" % type(fd))
1028 import io
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +00001029 return io.open(fd, *args, **kwargs)