blob: 4a40cfed6b502d27ea9ec2d7bdaf4c18aa7f65dc [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")
Larry Hastingsb698d8e2012-06-23 16:55:07 -0700160 _add("HAVE_UNLINKAT", "rmdir")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700161 _add("HAVE_UTIMENSAT", "utime")
162 supports_dir_fd = _set
163
164 _set = set()
165 _add("HAVE_FACCESSAT", "access")
166 supports_effective_ids = _set
167
168 _set = set()
169 _add("HAVE_FCHDIR", "chdir")
170 _add("HAVE_FCHMOD", "chmod")
171 _add("HAVE_FCHOWN", "chown")
172 _add("HAVE_FDOPENDIR", "listdir")
173 _add("HAVE_FEXECVE", "execve")
174 _set.add(stat) # fstat always works
175 _add("HAVE_FUTIMENS", "utime")
176 _add("HAVE_FUTIMES", "utime")
177 if _exists("statvfs") and _exists("fstatvfs"): # mac os x10.3
178 _add("HAVE_FSTATVFS", "statvfs")
179 supports_fd = _set
180
181 _set = set()
182 _add("HAVE_FACCESSAT", "access")
Larry Hastingsdbbc0c82012-06-22 19:50:21 -0700183 # Some platforms don't support lchmod(). Often the function exists
184 # anyway, as a stub that always returns ENOSUP or perhaps EOPNOTSUPP.
185 # (No, I don't know why that's a good design.) ./configure will detect
186 # this and reject it--so HAVE_LCHMOD still won't be defined on such
187 # platforms. This is Very Helpful.
188 #
189 # However, sometimes platforms without a working lchmod() *do* have
190 # fchmodat(). (Examples: Linux kernel 3.2 with glibc 2.15,
191 # OpenIndiana 3.x.) And fchmodat() has a flag that theoretically makes
192 # it behave like lchmod(). So in theory it would be a suitable
193 # replacement for lchmod(). But when lchmod() doesn't work, fchmodat()'s
194 # flag doesn't work *either*. Sadly ./configure isn't sophisticated
195 # enough to detect this condition--it only determines whether or not
196 # fchmodat() minimally works.
197 #
198 # Therefore we simply ignore fchmodat() when deciding whether or not
199 # os.chmod supports follow_symlinks. Just checking lchmod() is
200 # sufficient. After all--if you have a working fchmodat(), your
201 # lchmod() almost certainly works too.
202 #
203 # _add("HAVE_FCHMODAT", "chmod")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700204 _add("HAVE_FCHOWNAT", "chown")
205 _add("HAVE_FSTATAT", "stat")
206 _add("HAVE_LCHFLAGS", "chflags")
207 _add("HAVE_LCHMOD", "chmod")
208 if _exists("lchown"): # mac os x10.3
209 _add("HAVE_LCHOWN", "chown")
210 _add("HAVE_LINKAT", "link")
211 _add("HAVE_LUTIMES", "utime")
212 _add("HAVE_LSTAT", "stat")
213 _add("HAVE_FSTATAT", "stat")
214 _add("HAVE_UTIMENSAT", "utime")
215 _add("MS_WINDOWS", "stat")
216 supports_follow_symlinks = _set
217
Larry Hastings9cf065c2012-06-22 16:30:09 -0700218 del _set
219 del _have_functions
220 del _globals
221 del _add
222
223
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000224# Python uses fixed values for the SEEK_ constants; they are mapped
225# to native constants if necessary in posixmodule.c
Jesus Cea94363612012-06-22 18:32:07 +0200226# Other possible SEEK values are directly imported from posixmodule.c
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000227SEEK_SET = 0
228SEEK_CUR = 1
229SEEK_END = 2
230
Terry Reedy5a22b652010-12-02 07:05:56 +0000231
232def _get_masked_mode(mode):
233 mask = umask(0)
234 umask(mask)
235 return mode & ~mask
236
Guido van Rossum4def7de1998-07-24 20:48:03 +0000237# Super directory utilities.
238# (Inspired by Eric Raymond; the doc strings are mostly his)
239
Terry Reedy5a22b652010-12-02 07:05:56 +0000240def makedirs(name, mode=0o777, exist_ok=False):
241 """makedirs(path [, mode=0o777][, exist_ok=False])
Guido van Rossum4def7de1998-07-24 20:48:03 +0000242
243 Super-mkdir; create a leaf directory and all intermediate ones.
244 Works like mkdir, except that any intermediate path segment (not
Terry Reedy5a22b652010-12-02 07:05:56 +0000245 just the rightmost) will be created if it does not exist. If the
246 target directory with the same mode as we specified already exists,
247 raises an OSError if exist_ok is False, otherwise no exception is
248 raised. This is recursive.
Guido van Rossum4def7de1998-07-24 20:48:03 +0000249
250 """
251 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000252 if not tail:
253 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000254 if head and tail and not path.exists(head):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000255 try:
Terry Reedy5a22b652010-12-02 07:05:56 +0000256 makedirs(head, mode, exist_ok)
Guido van Rossumb940e112007-01-10 16:19:56 +0000257 except OSError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000258 # be happy if someone already created the path
Christian Heimes45f9af32007-11-27 21:50:00 +0000259 if e.errno != errno.EEXIST:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000260 raise
Andrew M. Kuchling6fccc8a2003-12-23 16:33:28 +0000261 if tail == curdir: # xxx/newdir/. exists if xxx/newdir exists
262 return
Terry Reedy5a22b652010-12-02 07:05:56 +0000263 try:
264 mkdir(name, mode)
265 except OSError as e:
Gregory P. Smitha81c8562012-06-03 14:30:44 -0700266 dir_exists = path.isdir(name)
267 expected_mode = _get_masked_mode(mode)
268 if dir_exists:
269 # S_ISGID is automatically copied by the OS from parent to child
270 # directories on mkdir. Don't consider it being set to be a mode
271 # mismatch as mkdir does not unset it when not specified in mode.
272 actual_mode = st.S_IMODE(lstat(name).st_mode) & ~st.S_ISGID
273 else:
274 actual_mode = -1
275 if not (e.errno == errno.EEXIST and exist_ok and dir_exists and
276 actual_mode == expected_mode):
277 if dir_exists and actual_mode != expected_mode:
278 e.strerror += ' (mode %o != expected mode %o)' % (
279 actual_mode, expected_mode)
Terry Reedy5a22b652010-12-02 07:05:56 +0000280 raise
Guido van Rossum4def7de1998-07-24 20:48:03 +0000281
282def removedirs(name):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000283 """removedirs(path)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000284
Fredrik Lundh96c1c7a2005-11-12 15:55:04 +0000285 Super-rmdir; remove a leaf directory and all empty intermediate
Guido van Rossum4def7de1998-07-24 20:48:03 +0000286 ones. Works like rmdir except that, if the leaf directory is
287 successfully removed, directories corresponding to rightmost path
Tim Petersc4e09402003-04-25 07:11:48 +0000288 segments will be pruned away until either the whole path is
Guido van Rossum4def7de1998-07-24 20:48:03 +0000289 consumed or an error occurs. Errors during this latter phase are
290 ignored -- they generally mean that a directory was not empty.
291
292 """
293 rmdir(name)
294 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000295 if not tail:
296 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000297 while head and tail:
298 try:
299 rmdir(head)
300 except error:
301 break
302 head, tail = path.split(head)
303
304def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000305 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000306
307 Super-rename; create directories as necessary and delete any left
308 empty. Works like rename, except creation of any intermediate
309 directories needed to make the new pathname good is attempted
310 first. After the rename, directories corresponding to rightmost
311 path segments of the old name will be pruned way until either the
312 whole path is consumed or a nonempty directory is found.
313
314 Note: this function can fail with the new directory structure made
315 if you lack permissions needed to unlink the leaf directory or
316 file.
317
318 """
319 head, tail = path.split(new)
320 if head and tail and not path.exists(head):
321 makedirs(head)
322 rename(old, new)
323 head, tail = path.split(old)
324 if head and tail:
325 try:
326 removedirs(head)
327 except error:
328 pass
329
Skip Montanaro269b83b2001-02-06 01:07:02 +0000330__all__.extend(["makedirs", "removedirs", "renames"])
331
Guido van Rossumd8faa362007-04-27 19:54:29 +0000332def walk(top, topdown=True, onerror=None, followlinks=False):
Tim Petersc4e09402003-04-25 07:11:48 +0000333 """Directory tree generator.
334
335 For each directory in the directory tree rooted at top (including top
336 itself, but excluding '.' and '..'), yields a 3-tuple
337
338 dirpath, dirnames, filenames
339
340 dirpath is a string, the path to the directory. dirnames is a list of
341 the names of the subdirectories in dirpath (excluding '.' and '..').
342 filenames is a list of the names of the non-directory files in dirpath.
343 Note that the names in the lists are just names, with no path components.
344 To get a full path (which begins with top) to a file or directory in
345 dirpath, do os.path.join(dirpath, name).
346
347 If optional arg 'topdown' is true or not specified, the triple for a
348 directory is generated before the triples for any of its subdirectories
349 (directories are generated top down). If topdown is false, the triple
350 for a directory is generated after the triples for all of its
351 subdirectories (directories are generated bottom up).
352
353 When topdown is true, the caller can modify the dirnames list in-place
354 (e.g., via del or slice assignment), and walk will only recurse into the
355 subdirectories whose names remain in dirnames; this can be used to prune
356 the search, or to impose a specific order of visiting. Modifying
357 dirnames when topdown is false is ineffective, since the directories in
358 dirnames have already been generated by the time dirnames itself is
359 generated.
360
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000361 By default errors from the os.listdir() call are ignored. If
362 optional arg 'onerror' is specified, it should be a function; it
363 will be called with one argument, an os.error instance. It can
364 report the error to continue with the walk, or raise the exception
365 to abort the walk. Note that the filename is available as the
366 filename attribute of the exception object.
367
Guido van Rossumd8faa362007-04-27 19:54:29 +0000368 By default, os.walk does not follow symbolic links to subdirectories on
369 systems that support them. In order to get this functionality, set the
370 optional argument 'followlinks' to true.
371
Tim Petersc4e09402003-04-25 07:11:48 +0000372 Caution: if you pass a relative pathname for top, don't change the
373 current working directory between resumptions of walk. walk never
374 changes the current directory, and assumes that the client doesn't
375 either.
376
377 Example:
378
Christian Heimes5d8da202008-05-06 13:58:24 +0000379 import os
Tim Petersc4e09402003-04-25 07:11:48 +0000380 from os.path import join, getsize
Christian Heimes5d8da202008-05-06 13:58:24 +0000381 for root, dirs, files in os.walk('python/Lib/email'):
Neal Norwitz752abd02008-05-13 04:55:24 +0000382 print(root, "consumes", end="")
383 print(sum([getsize(join(root, name)) for name in files]), end="")
384 print("bytes in", len(files), "non-directory files")
Tim Petersc4e09402003-04-25 07:11:48 +0000385 if 'CVS' in dirs:
386 dirs.remove('CVS') # don't visit CVS directories
387 """
388
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000389 islink, join, isdir = path.islink, path.join, path.isdir
Tim Petersc4e09402003-04-25 07:11:48 +0000390
391 # We may not have read permission for top, in which case we can't
Alexandre Vassalotti4e6531e2008-05-09 20:00:17 +0000392 # get a list of the files the directory contains. os.walk
Tim Petersc4e09402003-04-25 07:11:48 +0000393 # always suppressed the exception then, rather than blow up for a
394 # minor reason when (say) a thousand readable directories are still
395 # left to visit. That logic is copied here.
396 try:
397 # Note that listdir and error are globals in this module due
398 # to earlier import-*.
399 names = listdir(top)
Guido van Rossumb940e112007-01-10 16:19:56 +0000400 except error as err:
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000401 if onerror is not None:
402 onerror(err)
Tim Petersc4e09402003-04-25 07:11:48 +0000403 return
404
405 dirs, nondirs = [], []
406 for name in names:
407 if isdir(join(top, name)):
408 dirs.append(name)
409 else:
410 nondirs.append(name)
411
412 if topdown:
413 yield top, dirs, nondirs
414 for name in dirs:
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000415 new_path = join(top, name)
416 if followlinks or not islink(new_path):
Benjamin Peterson569d0872012-05-10 16:17:35 -0500417 yield from walk(new_path, topdown, onerror, followlinks)
Tim Petersc4e09402003-04-25 07:11:48 +0000418 if not topdown:
419 yield top, dirs, nondirs
420
421__all__.append("walk")
422
Larry Hastings9cf065c2012-06-22 16:30:09 -0700423if open in supports_dir_fd:
Charles-François Natali7372b062012-02-05 15:15:38 +0100424
425 def fwalk(top, topdown=True, onerror=None, followlinks=False):
426 """Directory tree generator.
427
428 This behaves exactly like walk(), except that it yields a 4-tuple
429
430 dirpath, dirnames, filenames, dirfd
431
432 `dirpath`, `dirnames` and `filenames` are identical to walk() output,
433 and `dirfd` is a file descriptor referring to the directory `dirpath`.
434
435 The advantage of walkfd() over walk() is that it's safe against symlink
436 races (when followlinks is False).
437
438 Caution:
439 Since fwalk() yields file descriptors, those are only valid until the
440 next iteration step, so you should dup() them if you want to keep them
441 for a longer period.
442
443 Example:
444
445 import os
446 for root, dirs, files, rootfd in os.fwalk('python/Lib/email'):
447 print(root, "consumes", end="")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700448 print(sum([os.stat(name, dir_fd=rootfd).st_size for name in files]),
Charles-François Natali7372b062012-02-05 15:15:38 +0100449 end="")
450 print("bytes in", len(files), "non-directory files")
451 if 'CVS' in dirs:
452 dirs.remove('CVS') # don't visit CVS directories
453 """
454 # Note: To guard against symlink races, we use the standard
455 # lstat()/open()/fstat() trick.
456 orig_st = lstat(top)
457 topfd = open(top, O_RDONLY)
458 try:
459 if (followlinks or (st.S_ISDIR(orig_st.st_mode) and
Charles-François Natali84c0ca02012-04-22 15:55:43 +0200460 path.samestat(orig_st, fstat(topfd)))):
Benjamin Peterson569d0872012-05-10 16:17:35 -0500461 yield from _fwalk(topfd, top, topdown, onerror, followlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100462 finally:
463 close(topfd)
464
465 def _fwalk(topfd, toppath, topdown, onerror, followlinks):
466 # Note: This uses O(depth of the directory tree) file descriptors: if
467 # necessary, it can be adapted to only require O(1) FDs, see issue
468 # #13734.
469
Larry Hastings9cf065c2012-06-22 16:30:09 -0700470 names = listdir(topfd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100471 dirs, nondirs = [], []
472 for name in names:
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200473 try:
474 # Here, we don't use AT_SYMLINK_NOFOLLOW to be consistent with
475 # walk() which reports symlinks to directories as directories.
476 # We do however check for symlinks before recursing into
477 # a subdirectory.
Larry Hastings9cf065c2012-06-22 16:30:09 -0700478 if st.S_ISDIR(stat(name, dir_fd=topfd).st_mode):
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200479 dirs.append(name)
480 else:
481 nondirs.append(name)
482 except FileNotFoundError:
483 try:
484 # Add dangling symlinks, ignore disappeared files
Larry Hastings9cf065c2012-06-22 16:30:09 -0700485 if st.S_ISLNK(stat(name, dir_fd=topfd, follow_symlinks=False)
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200486 .st_mode):
487 nondirs.append(name)
488 except FileNotFoundError:
489 continue
Charles-François Natali7372b062012-02-05 15:15:38 +0100490
491 if topdown:
492 yield toppath, dirs, nondirs, topfd
493
494 for name in dirs:
495 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700496 orig_st = stat(name, dir_fd=topfd, follow_symlinks=followlinks)
497 dirfd = open(name, O_RDONLY, dir_fd=topfd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100498 except error as err:
499 if onerror is not None:
500 onerror(err)
501 return
502 try:
Charles-François Natali84c0ca02012-04-22 15:55:43 +0200503 if followlinks or path.samestat(orig_st, fstat(dirfd)):
Charles-François Natali7372b062012-02-05 15:15:38 +0100504 dirpath = path.join(toppath, name)
Benjamin Peterson569d0872012-05-10 16:17:35 -0500505 yield from _fwalk(dirfd, dirpath, topdown, onerror, followlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100506 finally:
507 close(dirfd)
508
509 if not topdown:
510 yield toppath, dirs, nondirs, topfd
511
512 __all__.append("fwalk")
513
Guido van Rossuma28dab51997-08-29 22:36:47 +0000514# Make sure os.environ exists, at least
515try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000516 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000517except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000518 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000519
Guido van Rossume65cce51993-11-08 15:05:21 +0000520def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000521 """execl(file, *args)
522
523 Execute the executable file with argument list args, replacing the
524 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000525 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000526
527def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000528 """execle(file, *args, env)
529
530 Execute the executable file with argument list args and
531 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000532 env = args[-1]
533 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000534
535def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000536 """execlp(file, *args)
537
538 Execute the executable file (which is searched for along $PATH)
539 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000540 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000541
Guido van Rossum030afb11995-03-14 17:27:18 +0000542def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000543 """execlpe(file, *args, env)
544
545 Execute the executable file (which is searched for along $PATH)
546 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000547 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000548 env = args[-1]
549 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000550
Guido van Rossume65cce51993-11-08 15:05:21 +0000551def execvp(file, args):
Matthias Klosea09c54f2010-01-31 16:48:44 +0000552 """execvp(file, args)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000553
554 Execute the executable file (which is searched for along $PATH)
555 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000556 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000557 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000558
559def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000560 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000561
562 Execute the executable file (which is searched for along $PATH)
563 with argument list args and environment env , replacing the
564 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000565 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000566 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000567
Skip Montanaro269b83b2001-02-06 01:07:02 +0000568__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
569
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000570def _execvpe(file, args, env=None):
571 if env is not None:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000572 exec_func = execve
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000573 argrest = (args, env)
574 else:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000575 exec_func = execv
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000576 argrest = (args,)
577 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000578
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000579 head, tail = path.split(file)
580 if head:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000581 exec_func(file, *argrest)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000582 return
Guido van Rossume7ba4952007-06-06 23:52:48 +0000583 last_exc = saved_exc = None
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000584 saved_tb = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000585 path_list = get_exec_path(env)
586 if name != 'nt':
587 file = fsencode(file)
588 path_list = map(fsencode, path_list)
589 for dir in path_list:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000590 fullname = path.join(dir, file)
591 try:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000592 exec_func(fullname, *argrest)
Guido van Rossumb940e112007-01-10 16:19:56 +0000593 except error as e:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000594 last_exc = e
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000595 tb = sys.exc_info()[2]
Christian Heimes45f9af32007-11-27 21:50:00 +0000596 if (e.errno != errno.ENOENT and e.errno != errno.ENOTDIR
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000597 and saved_exc is None):
598 saved_exc = e
599 saved_tb = tb
600 if saved_exc:
Benjamin Peterson4b068192009-02-20 03:19:25 +0000601 raise saved_exc.with_traceback(saved_tb)
602 raise last_exc.with_traceback(tb)
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000603
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000604
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000605def get_exec_path(env=None):
606 """Returns the sequence of directories that will be searched for the
607 named executable (similar to a shell) when launching a process.
608
609 *env* must be an environment variable dict or None. If *env* is None,
610 os.environ will be used.
611 """
Victor Stinner273b7662010-11-06 12:59:33 +0000612 # Use a local import instead of a global import to limit the number of
613 # modules loaded at startup: the os module is always loaded at startup by
614 # Python. It may also avoid a bootstrap issue.
Victor Stinner6f35eda2010-10-29 00:38:58 +0000615 import warnings
616
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000617 if env is None:
618 env = environ
Victor Stinnerb745a742010-05-18 17:17:23 +0000619
Victor Stinnerbb4f2182010-11-07 15:43:39 +0000620 # {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a
621 # BytesWarning when using python -b or python -bb: ignore the warning
Victor Stinner273b7662010-11-06 12:59:33 +0000622 with warnings.catch_warnings():
623 warnings.simplefilter("ignore", BytesWarning)
Victor Stinnerb745a742010-05-18 17:17:23 +0000624
Victor Stinnerb745a742010-05-18 17:17:23 +0000625 try:
Victor Stinner273b7662010-11-06 12:59:33 +0000626 path_list = env.get('PATH')
627 except TypeError:
628 path_list = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000629
Victor Stinner273b7662010-11-06 12:59:33 +0000630 if supports_bytes_environ:
631 try:
632 path_listb = env[b'PATH']
633 except (KeyError, TypeError):
634 pass
635 else:
636 if path_list is not None:
637 raise ValueError(
638 "env cannot contain 'PATH' and b'PATH' keys")
639 path_list = path_listb
640
641 if path_list is not None and isinstance(path_list, bytes):
642 path_list = fsdecode(path_list)
Victor Stinnerb745a742010-05-18 17:17:23 +0000643
644 if path_list is None:
645 path_list = defpath
646 return path_list.split(pathsep)
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000647
648
Skip Montanaro289bc052007-08-17 02:30:27 +0000649# Change environ to automatically call putenv(), unsetenv if they exist.
Raymond Hettinger158c9c22011-02-22 00:41:50 +0000650from collections.abc import MutableMapping
Skip Montanaro289bc052007-08-17 02:30:27 +0000651
652class _Environ(MutableMapping):
Victor Stinner84ae1182010-05-06 22:05:07 +0000653 def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv):
654 self.encodekey = encodekey
655 self.decodekey = decodekey
656 self.encodevalue = encodevalue
657 self.decodevalue = decodevalue
Skip Montanaro289bc052007-08-17 02:30:27 +0000658 self.putenv = putenv
659 self.unsetenv = unsetenv
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000660 self._data = data
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000661
Skip Montanaro289bc052007-08-17 02:30:27 +0000662 def __getitem__(self, key):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000663 value = self._data[self.encodekey(key)]
Victor Stinner84ae1182010-05-06 22:05:07 +0000664 return self.decodevalue(value)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000665
Skip Montanaro289bc052007-08-17 02:30:27 +0000666 def __setitem__(self, key, value):
Victor Stinner84ae1182010-05-06 22:05:07 +0000667 key = self.encodekey(key)
668 value = self.encodevalue(value)
Skip Montanaro289bc052007-08-17 02:30:27 +0000669 self.putenv(key, value)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000670 self._data[key] = value
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000671
Skip Montanaro289bc052007-08-17 02:30:27 +0000672 def __delitem__(self, key):
Victor Stinner84ae1182010-05-06 22:05:07 +0000673 key = self.encodekey(key)
Skip Montanaro289bc052007-08-17 02:30:27 +0000674 self.unsetenv(key)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000675 del self._data[key]
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000676
Skip Montanaro289bc052007-08-17 02:30:27 +0000677 def __iter__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000678 for key in self._data:
Victor Stinner84ae1182010-05-06 22:05:07 +0000679 yield self.decodekey(key)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000680
Skip Montanaro289bc052007-08-17 02:30:27 +0000681 def __len__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000682 return len(self._data)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000683
684 def __repr__(self):
Victor Stinnerbed71172010-07-28 21:25:42 +0000685 return 'environ({{{}}})'.format(', '.join(
Victor Stinnerd73c1a32010-07-28 21:23:23 +0000686 ('{!r}: {!r}'.format(self.decodekey(key), self.decodevalue(value))
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000687 for key, value in self._data.items())))
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000688
Skip Montanaro289bc052007-08-17 02:30:27 +0000689 def copy(self):
690 return dict(self)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000691
Skip Montanaro289bc052007-08-17 02:30:27 +0000692 def setdefault(self, key, value):
693 if key not in self:
694 self[key] = value
695 return self[key]
696
697try:
698 _putenv = putenv
699except NameError:
700 _putenv = lambda key, value: None
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000701else:
Skip Montanaro289bc052007-08-17 02:30:27 +0000702 __all__.append("putenv")
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000703
Skip Montanaro289bc052007-08-17 02:30:27 +0000704try:
705 _unsetenv = unsetenv
706except NameError:
707 _unsetenv = lambda key: _putenv(key, "")
708else:
709 __all__.append("unsetenv")
Guido van Rossumc524d952001-10-19 01:31:59 +0000710
Victor Stinner84ae1182010-05-06 22:05:07 +0000711def _createenviron():
712 if name in ('os2', 'nt'):
713 # Where Env Var Names Must Be UPPERCASE
714 def check_str(value):
715 if not isinstance(value, str):
716 raise TypeError("str expected, not %s" % type(value).__name__)
717 return value
718 encode = check_str
719 decode = str
720 def encodekey(key):
721 return encode(key).upper()
722 data = {}
723 for key, value in environ.items():
724 data[encodekey(key)] = value
725 else:
726 # Where Env Var Names Can Be Mixed Case
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000727 encoding = sys.getfilesystemencoding()
Victor Stinner84ae1182010-05-06 22:05:07 +0000728 def encode(value):
729 if not isinstance(value, str):
730 raise TypeError("str expected, not %s" % type(value).__name__)
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000731 return value.encode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000732 def decode(value):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000733 return value.decode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000734 encodekey = encode
735 data = environ
736 return _Environ(data,
737 encodekey, decode,
738 encode, decode,
739 _putenv, _unsetenv)
Guido van Rossumc524d952001-10-19 01:31:59 +0000740
Victor Stinner84ae1182010-05-06 22:05:07 +0000741# unicode environ
742environ = _createenviron()
743del _createenviron
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000744
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000745
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000746def getenv(key, default=None):
Tim Peters2c60f7a2003-01-29 03:49:43 +0000747 """Get an environment variable, return None if it doesn't exist.
Victor Stinner84ae1182010-05-06 22:05:07 +0000748 The optional second argument can specify an alternate default.
749 key, default and the result are str."""
Tim Peters2c60f7a2003-01-29 03:49:43 +0000750 return environ.get(key, default)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000751
Victor Stinnerb745a742010-05-18 17:17:23 +0000752supports_bytes_environ = name not in ('os2', 'nt')
753__all__.extend(("getenv", "supports_bytes_environ"))
754
755if supports_bytes_environ:
Victor Stinner84ae1182010-05-06 22:05:07 +0000756 def _check_bytes(value):
757 if not isinstance(value, bytes):
758 raise TypeError("bytes expected, not %s" % type(value).__name__)
759 return value
760
761 # bytes environ
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000762 environb = _Environ(environ._data,
Victor Stinner84ae1182010-05-06 22:05:07 +0000763 _check_bytes, bytes,
764 _check_bytes, bytes,
765 _putenv, _unsetenv)
766 del _check_bytes
767
768 def getenvb(key, default=None):
769 """Get an environment variable, return None if it doesn't exist.
770 The optional second argument can specify an alternate default.
771 key, default and the result are bytes."""
772 return environb.get(key, default)
Victor Stinner70120e22010-07-29 17:19:38 +0000773
774 __all__.extend(("environb", "getenvb"))
Victor Stinner84ae1182010-05-06 22:05:07 +0000775
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000776def _fscodec():
777 encoding = sys.getfilesystemencoding()
778 if encoding == 'mbcs':
Victor Stinnere882aac2010-10-24 21:12:26 +0000779 errors = 'strict'
Victor Stinner313a1202010-06-11 23:56:51 +0000780 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000781 errors = 'surrogateescape'
Victor Stinnere8d51452010-08-19 01:05:19 +0000782
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000783 def fsencode(filename):
784 """
785 Encode filename to the filesystem encoding with 'surrogateescape' error
786 handler, return bytes unchanged. On Windows, use 'strict' error handler if
787 the file system encoding is 'mbcs' (which is the default encoding).
788 """
789 if isinstance(filename, bytes):
790 return filename
791 elif isinstance(filename, str):
792 return filename.encode(encoding, errors)
Victor Stinnere8d51452010-08-19 01:05:19 +0000793 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000794 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
795
796 def fsdecode(filename):
797 """
798 Decode filename from the filesystem encoding with 'surrogateescape' error
799 handler, return str unchanged. On Windows, use 'strict' error handler if
800 the file system encoding is 'mbcs' (which is the default encoding).
801 """
802 if isinstance(filename, str):
803 return filename
804 elif isinstance(filename, bytes):
805 return filename.decode(encoding, errors)
806 else:
807 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
808
809 return fsencode, fsdecode
810
811fsencode, fsdecode = _fscodec()
812del _fscodec
Victor Stinner449c4662010-05-08 11:10:09 +0000813
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000814# Supply spawn*() (probably only for Unix)
815if _exists("fork") and not _exists("spawnv") and _exists("execv"):
816
817 P_WAIT = 0
818 P_NOWAIT = P_NOWAITO = 1
819
Petri Lehtinen3bc37f22012-05-23 21:36:16 +0300820 __all__.extend(["P_WAIT", "P_NOWAIT", "P_NOWAITO"])
821
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000822 # XXX Should we support P_DETACH? I suppose it could fork()**2
823 # and close the std I/O streams. Also, P_OVERLAY is the same
824 # as execv*()?
825
826 def _spawnvef(mode, file, args, env, func):
827 # Internal helper; func is the exec*() function to use
828 pid = fork()
829 if not pid:
830 # Child
831 try:
832 if env is None:
833 func(file, args)
834 else:
835 func(file, args, env)
836 except:
837 _exit(127)
838 else:
839 # Parent
840 if mode == P_NOWAIT:
841 return pid # Caller is responsible for waiting!
842 while 1:
843 wpid, sts = waitpid(pid, 0)
844 if WIFSTOPPED(sts):
845 continue
846 elif WIFSIGNALED(sts):
847 return -WTERMSIG(sts)
848 elif WIFEXITED(sts):
849 return WEXITSTATUS(sts)
850 else:
Collin Winter828f04a2007-08-31 00:04:24 +0000851 raise error("Not stopped, signaled or exited???")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000852
853 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000854 """spawnv(mode, file, args) -> integer
855
856Execute file with arguments from args in a subprocess.
857If mode == P_NOWAIT return the pid of the process.
858If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000859otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000860 return _spawnvef(mode, file, args, None, execv)
861
862 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000863 """spawnve(mode, file, args, env) -> integer
864
865Execute file with arguments from args in a subprocess with the
866specified environment.
867If mode == P_NOWAIT return the pid of the process.
868If mode == P_WAIT return the process's exit code if it exits normally;
869otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000870 return _spawnvef(mode, file, args, env, execve)
871
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000872 # Note: spawnvp[e] is't currently supported on Windows
873
874 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000875 """spawnvp(mode, file, args) -> integer
876
877Execute file (which is looked for along $PATH) with arguments from
878args in a subprocess.
879If mode == P_NOWAIT return the pid of the process.
880If mode == P_WAIT return the process's exit code if it exits normally;
881otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000882 return _spawnvef(mode, file, args, None, execvp)
883
884 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000885 """spawnvpe(mode, file, args, env) -> integer
886
887Execute file (which is looked for along $PATH) with arguments from
888args in a subprocess with the supplied environment.
889If mode == P_NOWAIT return the pid of the process.
890If mode == P_WAIT return the process's exit code if it exits normally;
891otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000892 return _spawnvef(mode, file, args, env, execvpe)
893
894if _exists("spawnv"):
895 # These aren't supplied by the basic Windows code
896 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000897
898 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000899 """spawnl(mode, file, *args) -> integer
900
901Execute file with arguments from args in a subprocess.
902If mode == P_NOWAIT return the pid of the process.
903If mode == P_WAIT return the process's exit code if it exits normally;
904otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000905 return spawnv(mode, file, args)
906
907 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000908 """spawnle(mode, file, *args, env) -> integer
909
910Execute file with arguments from args in a subprocess with the
911supplied environment.
912If mode == P_NOWAIT return the pid of the process.
913If mode == P_WAIT return the process's exit code if it exits normally;
914otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000915 env = args[-1]
916 return spawnve(mode, file, args[:-1], env)
917
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000918
919 __all__.extend(["spawnv", "spawnve", "spawnl", "spawnle",])
920
921
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000922if _exists("spawnvp"):
923 # At the moment, Windows doesn't implement spawnvp[e],
924 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000925 def spawnlp(mode, file, *args):
Neal Norwitzb7f68102003-07-02 02:49:33 +0000926 """spawnlp(mode, file, *args) -> integer
Guido van Rossume0cd2912000-04-21 18:35:36 +0000927
928Execute file (which is looked for along $PATH) with arguments from
929args in a subprocess with the supplied environment.
930If mode == P_NOWAIT return the pid of the process.
931If mode == P_WAIT return the process's exit code if it exits normally;
932otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000933 return spawnvp(mode, file, args)
934
935 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000936 """spawnlpe(mode, file, *args, env) -> integer
937
938Execute file (which is looked for along $PATH) with arguments from
939args in a subprocess with the supplied environment.
940If mode == P_NOWAIT return the pid of the process.
941If mode == P_WAIT return the process's exit code if it exits normally;
942otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000943 env = args[-1]
944 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000945
946
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000947 __all__.extend(["spawnvp", "spawnvpe", "spawnlp", "spawnlpe",])
Skip Montanaro269b83b2001-02-06 01:07:02 +0000948
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000949import copyreg as _copyreg
Michael W. Hudson0e025302002-03-06 17:11:18 +0000950
951def _make_stat_result(tup, dict):
952 return stat_result(tup, dict)
953
954def _pickle_stat_result(sr):
955 (type, args) = sr.__reduce__()
956 return (_make_stat_result, args)
957
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000958try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000959 _copyreg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000960except NameError: # stat_result may not exist
961 pass
Michael W. Hudson0e025302002-03-06 17:11:18 +0000962
963def _make_statvfs_result(tup, dict):
964 return statvfs_result(tup, dict)
965
966def _pickle_statvfs_result(sr):
967 (type, args) = sr.__reduce__()
968 return (_make_statvfs_result, args)
969
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000970try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000971 _copyreg.pickle(statvfs_result, _pickle_statvfs_result,
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000972 _make_statvfs_result)
Michael W. Hudsone5363b72002-03-15 10:21:59 +0000973except NameError: # statvfs_result may not exist
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000974 pass
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000975
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000976# Supply os.popen()
Antoine Pitrou877766d2011-03-19 17:00:37 +0100977def popen(cmd, mode="r", buffering=-1):
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000978 if not isinstance(cmd, str):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000979 raise TypeError("invalid cmd type (%s, expected string)" % type(cmd))
980 if mode not in ("r", "w"):
981 raise ValueError("invalid mode %r" % mode)
Antoine Pitrou877766d2011-03-19 17:00:37 +0100982 if buffering == 0 or buffering == None:
983 raise ValueError("popen() does not support unbuffered streams")
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000984 import subprocess, io
985 if mode == "r":
986 proc = subprocess.Popen(cmd,
987 shell=True,
988 stdout=subprocess.PIPE,
989 bufsize=buffering)
990 return _wrap_close(io.TextIOWrapper(proc.stdout), proc)
991 else:
992 proc = subprocess.Popen(cmd,
993 shell=True,
994 stdin=subprocess.PIPE,
995 bufsize=buffering)
996 return _wrap_close(io.TextIOWrapper(proc.stdin), proc)
997
998# Helper for popen() -- a proxy for a file whose close waits for the process
999class _wrap_close:
1000 def __init__(self, stream, proc):
1001 self._stream = stream
1002 self._proc = proc
1003 def close(self):
1004 self._stream.close()
Amaury Forgeot d'Arc97e5f282009-07-11 09:35:13 +00001005 returncode = self._proc.wait()
1006 if returncode == 0:
1007 return None
1008 if name == 'nt':
1009 return returncode
1010 else:
1011 return returncode << 8 # Shift left to match old behavior
Antoine Pitrouac625352009-12-09 00:01:27 +00001012 def __enter__(self):
1013 return self
1014 def __exit__(self, *args):
1015 self.close()
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001016 def __getattr__(self, name):
1017 return getattr(self._stream, name)
Thomas Heller476157b2007-09-04 11:27:47 +00001018 def __iter__(self):
1019 return iter(self._stream)
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001020
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +00001021# Supply os.fdopen()
1022def fdopen(fd, *args, **kwargs):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001023 if not isinstance(fd, int):
1024 raise TypeError("invalid fd type (%s, expected integer)" % type(fd))
1025 import io
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +00001026 return io.open(fd, *args, **kwargs)