blob: 842512a6705f8e8fc332df932372dff2998afe62 [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
Georg Brandl306336b2012-06-24 12:55:33 +0200175 _add("HAVE_FTRUNCATE", "truncate")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700176 _add("HAVE_FUTIMENS", "utime")
177 _add("HAVE_FUTIMES", "utime")
Georg Brandl306336b2012-06-24 12:55:33 +0200178 _add("HAVE_FPATHCONF", "pathconf")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700179 if _exists("statvfs") and _exists("fstatvfs"): # mac os x10.3
180 _add("HAVE_FSTATVFS", "statvfs")
181 supports_fd = _set
182
183 _set = set()
184 _add("HAVE_FACCESSAT", "access")
Larry Hastingsdbbc0c82012-06-22 19:50:21 -0700185 # Some platforms don't support lchmod(). Often the function exists
186 # anyway, as a stub that always returns ENOSUP or perhaps EOPNOTSUPP.
187 # (No, I don't know why that's a good design.) ./configure will detect
188 # this and reject it--so HAVE_LCHMOD still won't be defined on such
189 # platforms. This is Very Helpful.
190 #
191 # However, sometimes platforms without a working lchmod() *do* have
192 # fchmodat(). (Examples: Linux kernel 3.2 with glibc 2.15,
193 # OpenIndiana 3.x.) And fchmodat() has a flag that theoretically makes
194 # it behave like lchmod(). So in theory it would be a suitable
195 # replacement for lchmod(). But when lchmod() doesn't work, fchmodat()'s
196 # flag doesn't work *either*. Sadly ./configure isn't sophisticated
197 # enough to detect this condition--it only determines whether or not
198 # fchmodat() minimally works.
199 #
200 # Therefore we simply ignore fchmodat() when deciding whether or not
201 # os.chmod supports follow_symlinks. Just checking lchmod() is
202 # sufficient. After all--if you have a working fchmodat(), your
203 # lchmod() almost certainly works too.
204 #
205 # _add("HAVE_FCHMODAT", "chmod")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700206 _add("HAVE_FCHOWNAT", "chown")
207 _add("HAVE_FSTATAT", "stat")
208 _add("HAVE_LCHFLAGS", "chflags")
209 _add("HAVE_LCHMOD", "chmod")
210 if _exists("lchown"): # mac os x10.3
211 _add("HAVE_LCHOWN", "chown")
212 _add("HAVE_LINKAT", "link")
213 _add("HAVE_LUTIMES", "utime")
214 _add("HAVE_LSTAT", "stat")
215 _add("HAVE_FSTATAT", "stat")
216 _add("HAVE_UTIMENSAT", "utime")
217 _add("MS_WINDOWS", "stat")
218 supports_follow_symlinks = _set
219
Larry Hastings9cf065c2012-06-22 16:30:09 -0700220 del _set
221 del _have_functions
222 del _globals
223 del _add
224
225
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000226# Python uses fixed values for the SEEK_ constants; they are mapped
227# to native constants if necessary in posixmodule.c
Jesus Cea94363612012-06-22 18:32:07 +0200228# Other possible SEEK values are directly imported from posixmodule.c
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000229SEEK_SET = 0
230SEEK_CUR = 1
231SEEK_END = 2
232
Terry Reedy5a22b652010-12-02 07:05:56 +0000233
234def _get_masked_mode(mode):
235 mask = umask(0)
236 umask(mask)
237 return mode & ~mask
238
Guido van Rossum4def7de1998-07-24 20:48:03 +0000239# Super directory utilities.
240# (Inspired by Eric Raymond; the doc strings are mostly his)
241
Terry Reedy5a22b652010-12-02 07:05:56 +0000242def makedirs(name, mode=0o777, exist_ok=False):
243 """makedirs(path [, mode=0o777][, exist_ok=False])
Guido van Rossum4def7de1998-07-24 20:48:03 +0000244
245 Super-mkdir; create a leaf directory and all intermediate ones.
246 Works like mkdir, except that any intermediate path segment (not
Terry Reedy5a22b652010-12-02 07:05:56 +0000247 just the rightmost) will be created if it does not exist. If the
248 target directory with the same mode as we specified already exists,
249 raises an OSError if exist_ok is False, otherwise no exception is
250 raised. This is recursive.
Guido van Rossum4def7de1998-07-24 20:48:03 +0000251
252 """
253 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000254 if not tail:
255 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000256 if head and tail and not path.exists(head):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000257 try:
Terry Reedy5a22b652010-12-02 07:05:56 +0000258 makedirs(head, mode, exist_ok)
Guido van Rossumb940e112007-01-10 16:19:56 +0000259 except OSError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000260 # be happy if someone already created the path
Christian Heimes45f9af32007-11-27 21:50:00 +0000261 if e.errno != errno.EEXIST:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000262 raise
Andrew M. Kuchling6fccc8a2003-12-23 16:33:28 +0000263 if tail == curdir: # xxx/newdir/. exists if xxx/newdir exists
264 return
Terry Reedy5a22b652010-12-02 07:05:56 +0000265 try:
266 mkdir(name, mode)
267 except OSError as e:
Gregory P. Smitha81c8562012-06-03 14:30:44 -0700268 dir_exists = path.isdir(name)
269 expected_mode = _get_masked_mode(mode)
270 if dir_exists:
271 # S_ISGID is automatically copied by the OS from parent to child
272 # directories on mkdir. Don't consider it being set to be a mode
273 # mismatch as mkdir does not unset it when not specified in mode.
274 actual_mode = st.S_IMODE(lstat(name).st_mode) & ~st.S_ISGID
275 else:
276 actual_mode = -1
277 if not (e.errno == errno.EEXIST and exist_ok and dir_exists and
278 actual_mode == expected_mode):
279 if dir_exists and actual_mode != expected_mode:
280 e.strerror += ' (mode %o != expected mode %o)' % (
281 actual_mode, expected_mode)
Terry Reedy5a22b652010-12-02 07:05:56 +0000282 raise
Guido van Rossum4def7de1998-07-24 20:48:03 +0000283
284def removedirs(name):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000285 """removedirs(path)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000286
Fredrik Lundh96c1c7a2005-11-12 15:55:04 +0000287 Super-rmdir; remove a leaf directory and all empty intermediate
Guido van Rossum4def7de1998-07-24 20:48:03 +0000288 ones. Works like rmdir except that, if the leaf directory is
289 successfully removed, directories corresponding to rightmost path
Tim Petersc4e09402003-04-25 07:11:48 +0000290 segments will be pruned away until either the whole path is
Guido van Rossum4def7de1998-07-24 20:48:03 +0000291 consumed or an error occurs. Errors during this latter phase are
292 ignored -- they generally mean that a directory was not empty.
293
294 """
295 rmdir(name)
296 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000297 if not tail:
298 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000299 while head and tail:
300 try:
301 rmdir(head)
302 except error:
303 break
304 head, tail = path.split(head)
305
306def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000307 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000308
309 Super-rename; create directories as necessary and delete any left
310 empty. Works like rename, except creation of any intermediate
311 directories needed to make the new pathname good is attempted
312 first. After the rename, directories corresponding to rightmost
313 path segments of the old name will be pruned way until either the
314 whole path is consumed or a nonempty directory is found.
315
316 Note: this function can fail with the new directory structure made
317 if you lack permissions needed to unlink the leaf directory or
318 file.
319
320 """
321 head, tail = path.split(new)
322 if head and tail and not path.exists(head):
323 makedirs(head)
324 rename(old, new)
325 head, tail = path.split(old)
326 if head and tail:
327 try:
328 removedirs(head)
329 except error:
330 pass
331
Skip Montanaro269b83b2001-02-06 01:07:02 +0000332__all__.extend(["makedirs", "removedirs", "renames"])
333
Guido van Rossumd8faa362007-04-27 19:54:29 +0000334def walk(top, topdown=True, onerror=None, followlinks=False):
Tim Petersc4e09402003-04-25 07:11:48 +0000335 """Directory tree generator.
336
337 For each directory in the directory tree rooted at top (including top
338 itself, but excluding '.' and '..'), yields a 3-tuple
339
340 dirpath, dirnames, filenames
341
342 dirpath is a string, the path to the directory. dirnames is a list of
343 the names of the subdirectories in dirpath (excluding '.' and '..').
344 filenames is a list of the names of the non-directory files in dirpath.
345 Note that the names in the lists are just names, with no path components.
346 To get a full path (which begins with top) to a file or directory in
347 dirpath, do os.path.join(dirpath, name).
348
349 If optional arg 'topdown' is true or not specified, the triple for a
350 directory is generated before the triples for any of its subdirectories
351 (directories are generated top down). If topdown is false, the triple
352 for a directory is generated after the triples for all of its
353 subdirectories (directories are generated bottom up).
354
355 When topdown is true, the caller can modify the dirnames list in-place
356 (e.g., via del or slice assignment), and walk will only recurse into the
357 subdirectories whose names remain in dirnames; this can be used to prune
358 the search, or to impose a specific order of visiting. Modifying
359 dirnames when topdown is false is ineffective, since the directories in
360 dirnames have already been generated by the time dirnames itself is
361 generated.
362
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000363 By default errors from the os.listdir() call are ignored. If
364 optional arg 'onerror' is specified, it should be a function; it
365 will be called with one argument, an os.error instance. It can
366 report the error to continue with the walk, or raise the exception
367 to abort the walk. Note that the filename is available as the
368 filename attribute of the exception object.
369
Guido van Rossumd8faa362007-04-27 19:54:29 +0000370 By default, os.walk does not follow symbolic links to subdirectories on
371 systems that support them. In order to get this functionality, set the
372 optional argument 'followlinks' to true.
373
Tim Petersc4e09402003-04-25 07:11:48 +0000374 Caution: if you pass a relative pathname for top, don't change the
375 current working directory between resumptions of walk. walk never
376 changes the current directory, and assumes that the client doesn't
377 either.
378
379 Example:
380
Christian Heimes5d8da202008-05-06 13:58:24 +0000381 import os
Tim Petersc4e09402003-04-25 07:11:48 +0000382 from os.path import join, getsize
Christian Heimes5d8da202008-05-06 13:58:24 +0000383 for root, dirs, files in os.walk('python/Lib/email'):
Neal Norwitz752abd02008-05-13 04:55:24 +0000384 print(root, "consumes", end="")
385 print(sum([getsize(join(root, name)) for name in files]), end="")
386 print("bytes in", len(files), "non-directory files")
Tim Petersc4e09402003-04-25 07:11:48 +0000387 if 'CVS' in dirs:
388 dirs.remove('CVS') # don't visit CVS directories
389 """
390
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000391 islink, join, isdir = path.islink, path.join, path.isdir
Tim Petersc4e09402003-04-25 07:11:48 +0000392
393 # We may not have read permission for top, in which case we can't
Alexandre Vassalotti4e6531e2008-05-09 20:00:17 +0000394 # get a list of the files the directory contains. os.walk
Tim Petersc4e09402003-04-25 07:11:48 +0000395 # always suppressed the exception then, rather than blow up for a
396 # minor reason when (say) a thousand readable directories are still
397 # left to visit. That logic is copied here.
398 try:
399 # Note that listdir and error are globals in this module due
400 # to earlier import-*.
401 names = listdir(top)
Guido van Rossumb940e112007-01-10 16:19:56 +0000402 except error as err:
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000403 if onerror is not None:
404 onerror(err)
Tim Petersc4e09402003-04-25 07:11:48 +0000405 return
406
407 dirs, nondirs = [], []
408 for name in names:
409 if isdir(join(top, name)):
410 dirs.append(name)
411 else:
412 nondirs.append(name)
413
414 if topdown:
415 yield top, dirs, nondirs
416 for name in dirs:
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000417 new_path = join(top, name)
418 if followlinks or not islink(new_path):
Benjamin Peterson569d0872012-05-10 16:17:35 -0500419 yield from walk(new_path, topdown, onerror, followlinks)
Tim Petersc4e09402003-04-25 07:11:48 +0000420 if not topdown:
421 yield top, dirs, nondirs
422
423__all__.append("walk")
424
Larry Hastingsc48fe982012-06-25 04:49:05 -0700425if {open, stat} <= supports_dir_fd and {listdir, stat} <= supports_fd:
Charles-François Natali7372b062012-02-05 15:15:38 +0100426
Larry Hastingsb4038062012-07-15 10:57:38 -0700427 def fwalk(top=".", topdown=True, onerror=None, *, follow_symlinks=False, dir_fd=None):
Charles-François Natali7372b062012-02-05 15:15:38 +0100428 """Directory tree generator.
429
430 This behaves exactly like walk(), except that it yields a 4-tuple
431
432 dirpath, dirnames, filenames, dirfd
433
434 `dirpath`, `dirnames` and `filenames` are identical to walk() output,
435 and `dirfd` is a file descriptor referring to the directory `dirpath`.
436
Larry Hastingsc48fe982012-06-25 04:49:05 -0700437 The advantage of fwalk() over walk() is that it's safe against symlink
Larry Hastingsb4038062012-07-15 10:57:38 -0700438 races (when follow_symlinks is False).
Charles-François Natali7372b062012-02-05 15:15:38 +0100439
Larry Hastingsc48fe982012-06-25 04:49:05 -0700440 If dir_fd is not None, it should be a file descriptor open to a directory,
441 and top should be relative; top will then be relative to that directory.
442 (dir_fd is always supported for fwalk.)
443
Charles-François Natali7372b062012-02-05 15:15:38 +0100444 Caution:
445 Since fwalk() yields file descriptors, those are only valid until the
446 next iteration step, so you should dup() them if you want to keep them
447 for a longer period.
448
449 Example:
450
451 import os
452 for root, dirs, files, rootfd in os.fwalk('python/Lib/email'):
453 print(root, "consumes", end="")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700454 print(sum([os.stat(name, dir_fd=rootfd).st_size for name in files]),
Charles-François Natali7372b062012-02-05 15:15:38 +0100455 end="")
456 print("bytes in", len(files), "non-directory files")
457 if 'CVS' in dirs:
458 dirs.remove('CVS') # don't visit CVS directories
459 """
460 # Note: To guard against symlink races, we use the standard
461 # lstat()/open()/fstat() trick.
Larry Hastingsc48fe982012-06-25 04:49:05 -0700462 orig_st = stat(top, follow_symlinks=False, dir_fd=dir_fd)
463 topfd = open(top, O_RDONLY, dir_fd=dir_fd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100464 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700465 if (follow_symlinks or (st.S_ISDIR(orig_st.st_mode) and
466 path.samestat(orig_st, stat(topfd)))):
467 yield from _fwalk(topfd, top, topdown, onerror, follow_symlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100468 finally:
469 close(topfd)
470
Larry Hastingsb4038062012-07-15 10:57:38 -0700471 def _fwalk(topfd, toppath, topdown, onerror, follow_symlinks):
Charles-François Natali7372b062012-02-05 15:15:38 +0100472 # Note: This uses O(depth of the directory tree) file descriptors: if
473 # necessary, it can be adapted to only require O(1) FDs, see issue
474 # #13734.
475
Larry Hastings9cf065c2012-06-22 16:30:09 -0700476 names = listdir(topfd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100477 dirs, nondirs = [], []
478 for name in names:
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200479 try:
480 # Here, we don't use AT_SYMLINK_NOFOLLOW to be consistent with
481 # walk() which reports symlinks to directories as directories.
482 # We do however check for symlinks before recursing into
483 # a subdirectory.
Larry Hastings9cf065c2012-06-22 16:30:09 -0700484 if st.S_ISDIR(stat(name, dir_fd=topfd).st_mode):
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200485 dirs.append(name)
486 else:
487 nondirs.append(name)
488 except FileNotFoundError:
489 try:
490 # Add dangling symlinks, ignore disappeared files
Larry Hastings9cf065c2012-06-22 16:30:09 -0700491 if st.S_ISLNK(stat(name, dir_fd=topfd, follow_symlinks=False)
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200492 .st_mode):
493 nondirs.append(name)
494 except FileNotFoundError:
495 continue
Charles-François Natali7372b062012-02-05 15:15:38 +0100496
497 if topdown:
498 yield toppath, dirs, nondirs, topfd
499
500 for name in dirs:
501 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700502 orig_st = stat(name, dir_fd=topfd, follow_symlinks=follow_symlinks)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700503 dirfd = open(name, O_RDONLY, dir_fd=topfd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100504 except error as err:
505 if onerror is not None:
506 onerror(err)
507 return
508 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700509 if follow_symlinks or path.samestat(orig_st, stat(dirfd)):
Charles-François Natali7372b062012-02-05 15:15:38 +0100510 dirpath = path.join(toppath, name)
Larry Hastingsb4038062012-07-15 10:57:38 -0700511 yield from _fwalk(dirfd, dirpath, topdown, onerror, follow_symlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100512 finally:
513 close(dirfd)
514
515 if not topdown:
516 yield toppath, dirs, nondirs, topfd
517
518 __all__.append("fwalk")
519
Guido van Rossuma28dab51997-08-29 22:36:47 +0000520# Make sure os.environ exists, at least
521try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000522 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000523except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000524 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000525
Guido van Rossume65cce51993-11-08 15:05:21 +0000526def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000527 """execl(file, *args)
528
529 Execute the executable file with argument list args, replacing the
530 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000531 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000532
533def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000534 """execle(file, *args, env)
535
536 Execute the executable file with argument list args and
537 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000538 env = args[-1]
539 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000540
541def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000542 """execlp(file, *args)
543
544 Execute the executable file (which is searched for along $PATH)
545 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000546 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000547
Guido van Rossum030afb11995-03-14 17:27:18 +0000548def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000549 """execlpe(file, *args, env)
550
551 Execute the executable file (which is searched for along $PATH)
552 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000553 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000554 env = args[-1]
555 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000556
Guido van Rossume65cce51993-11-08 15:05:21 +0000557def execvp(file, args):
Matthias Klosea09c54f2010-01-31 16:48:44 +0000558 """execvp(file, args)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000559
560 Execute the executable file (which is searched for along $PATH)
561 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000562 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000563 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000564
565def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000566 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000567
568 Execute the executable file (which is searched for along $PATH)
569 with argument list args and environment env , replacing the
570 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000571 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000572 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000573
Skip Montanaro269b83b2001-02-06 01:07:02 +0000574__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
575
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000576def _execvpe(file, args, env=None):
577 if env is not None:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000578 exec_func = execve
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000579 argrest = (args, env)
580 else:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000581 exec_func = execv
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000582 argrest = (args,)
583 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000584
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000585 head, tail = path.split(file)
586 if head:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000587 exec_func(file, *argrest)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000588 return
Guido van Rossume7ba4952007-06-06 23:52:48 +0000589 last_exc = saved_exc = None
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000590 saved_tb = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000591 path_list = get_exec_path(env)
592 if name != 'nt':
593 file = fsencode(file)
594 path_list = map(fsencode, path_list)
595 for dir in path_list:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000596 fullname = path.join(dir, file)
597 try:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000598 exec_func(fullname, *argrest)
Guido van Rossumb940e112007-01-10 16:19:56 +0000599 except error as e:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000600 last_exc = e
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000601 tb = sys.exc_info()[2]
Christian Heimes45f9af32007-11-27 21:50:00 +0000602 if (e.errno != errno.ENOENT and e.errno != errno.ENOTDIR
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000603 and saved_exc is None):
604 saved_exc = e
605 saved_tb = tb
606 if saved_exc:
Benjamin Peterson4b068192009-02-20 03:19:25 +0000607 raise saved_exc.with_traceback(saved_tb)
608 raise last_exc.with_traceback(tb)
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000609
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000610
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000611def get_exec_path(env=None):
612 """Returns the sequence of directories that will be searched for the
613 named executable (similar to a shell) when launching a process.
614
615 *env* must be an environment variable dict or None. If *env* is None,
616 os.environ will be used.
617 """
Victor Stinner273b7662010-11-06 12:59:33 +0000618 # Use a local import instead of a global import to limit the number of
619 # modules loaded at startup: the os module is always loaded at startup by
620 # Python. It may also avoid a bootstrap issue.
Victor Stinner6f35eda2010-10-29 00:38:58 +0000621 import warnings
622
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000623 if env is None:
624 env = environ
Victor Stinnerb745a742010-05-18 17:17:23 +0000625
Victor Stinnerbb4f2182010-11-07 15:43:39 +0000626 # {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a
627 # BytesWarning when using python -b or python -bb: ignore the warning
Victor Stinner273b7662010-11-06 12:59:33 +0000628 with warnings.catch_warnings():
629 warnings.simplefilter("ignore", BytesWarning)
Victor Stinnerb745a742010-05-18 17:17:23 +0000630
Victor Stinnerb745a742010-05-18 17:17:23 +0000631 try:
Victor Stinner273b7662010-11-06 12:59:33 +0000632 path_list = env.get('PATH')
633 except TypeError:
634 path_list = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000635
Victor Stinner273b7662010-11-06 12:59:33 +0000636 if supports_bytes_environ:
637 try:
638 path_listb = env[b'PATH']
639 except (KeyError, TypeError):
640 pass
641 else:
642 if path_list is not None:
643 raise ValueError(
644 "env cannot contain 'PATH' and b'PATH' keys")
645 path_list = path_listb
646
647 if path_list is not None and isinstance(path_list, bytes):
648 path_list = fsdecode(path_list)
Victor Stinnerb745a742010-05-18 17:17:23 +0000649
650 if path_list is None:
651 path_list = defpath
652 return path_list.split(pathsep)
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000653
654
Skip Montanaro289bc052007-08-17 02:30:27 +0000655# Change environ to automatically call putenv(), unsetenv if they exist.
Raymond Hettinger158c9c22011-02-22 00:41:50 +0000656from collections.abc import MutableMapping
Skip Montanaro289bc052007-08-17 02:30:27 +0000657
658class _Environ(MutableMapping):
Victor Stinner84ae1182010-05-06 22:05:07 +0000659 def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv):
660 self.encodekey = encodekey
661 self.decodekey = decodekey
662 self.encodevalue = encodevalue
663 self.decodevalue = decodevalue
Skip Montanaro289bc052007-08-17 02:30:27 +0000664 self.putenv = putenv
665 self.unsetenv = unsetenv
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000666 self._data = data
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000667
Skip Montanaro289bc052007-08-17 02:30:27 +0000668 def __getitem__(self, key):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000669 value = self._data[self.encodekey(key)]
Victor Stinner84ae1182010-05-06 22:05:07 +0000670 return self.decodevalue(value)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000671
Skip Montanaro289bc052007-08-17 02:30:27 +0000672 def __setitem__(self, key, value):
Victor Stinner84ae1182010-05-06 22:05:07 +0000673 key = self.encodekey(key)
674 value = self.encodevalue(value)
Skip Montanaro289bc052007-08-17 02:30:27 +0000675 self.putenv(key, value)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000676 self._data[key] = value
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000677
Skip Montanaro289bc052007-08-17 02:30:27 +0000678 def __delitem__(self, key):
Victor Stinner84ae1182010-05-06 22:05:07 +0000679 key = self.encodekey(key)
Skip Montanaro289bc052007-08-17 02:30:27 +0000680 self.unsetenv(key)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000681 del self._data[key]
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000682
Skip Montanaro289bc052007-08-17 02:30:27 +0000683 def __iter__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000684 for key in self._data:
Victor Stinner84ae1182010-05-06 22:05:07 +0000685 yield self.decodekey(key)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000686
Skip Montanaro289bc052007-08-17 02:30:27 +0000687 def __len__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000688 return len(self._data)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000689
690 def __repr__(self):
Victor Stinnerbed71172010-07-28 21:25:42 +0000691 return 'environ({{{}}})'.format(', '.join(
Victor Stinnerd73c1a32010-07-28 21:23:23 +0000692 ('{!r}: {!r}'.format(self.decodekey(key), self.decodevalue(value))
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000693 for key, value in self._data.items())))
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000694
Skip Montanaro289bc052007-08-17 02:30:27 +0000695 def copy(self):
696 return dict(self)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000697
Skip Montanaro289bc052007-08-17 02:30:27 +0000698 def setdefault(self, key, value):
699 if key not in self:
700 self[key] = value
701 return self[key]
702
703try:
704 _putenv = putenv
705except NameError:
706 _putenv = lambda key, value: None
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000707else:
Skip Montanaro289bc052007-08-17 02:30:27 +0000708 __all__.append("putenv")
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000709
Skip Montanaro289bc052007-08-17 02:30:27 +0000710try:
711 _unsetenv = unsetenv
712except NameError:
713 _unsetenv = lambda key: _putenv(key, "")
714else:
715 __all__.append("unsetenv")
Guido van Rossumc524d952001-10-19 01:31:59 +0000716
Victor Stinner84ae1182010-05-06 22:05:07 +0000717def _createenviron():
718 if name in ('os2', 'nt'):
719 # Where Env Var Names Must Be UPPERCASE
720 def check_str(value):
721 if not isinstance(value, str):
722 raise TypeError("str expected, not %s" % type(value).__name__)
723 return value
724 encode = check_str
725 decode = str
726 def encodekey(key):
727 return encode(key).upper()
728 data = {}
729 for key, value in environ.items():
730 data[encodekey(key)] = value
731 else:
732 # Where Env Var Names Can Be Mixed Case
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000733 encoding = sys.getfilesystemencoding()
Victor Stinner84ae1182010-05-06 22:05:07 +0000734 def encode(value):
735 if not isinstance(value, str):
736 raise TypeError("str expected, not %s" % type(value).__name__)
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000737 return value.encode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000738 def decode(value):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000739 return value.decode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000740 encodekey = encode
741 data = environ
742 return _Environ(data,
743 encodekey, decode,
744 encode, decode,
745 _putenv, _unsetenv)
Guido van Rossumc524d952001-10-19 01:31:59 +0000746
Victor Stinner84ae1182010-05-06 22:05:07 +0000747# unicode environ
748environ = _createenviron()
749del _createenviron
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000750
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000751
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000752def getenv(key, default=None):
Tim Peters2c60f7a2003-01-29 03:49:43 +0000753 """Get an environment variable, return None if it doesn't exist.
Victor Stinner84ae1182010-05-06 22:05:07 +0000754 The optional second argument can specify an alternate default.
755 key, default and the result are str."""
Tim Peters2c60f7a2003-01-29 03:49:43 +0000756 return environ.get(key, default)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000757
Victor Stinnerb745a742010-05-18 17:17:23 +0000758supports_bytes_environ = name not in ('os2', 'nt')
759__all__.extend(("getenv", "supports_bytes_environ"))
760
761if supports_bytes_environ:
Victor Stinner84ae1182010-05-06 22:05:07 +0000762 def _check_bytes(value):
763 if not isinstance(value, bytes):
764 raise TypeError("bytes expected, not %s" % type(value).__name__)
765 return value
766
767 # bytes environ
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000768 environb = _Environ(environ._data,
Victor Stinner84ae1182010-05-06 22:05:07 +0000769 _check_bytes, bytes,
770 _check_bytes, bytes,
771 _putenv, _unsetenv)
772 del _check_bytes
773
774 def getenvb(key, default=None):
775 """Get an environment variable, return None if it doesn't exist.
776 The optional second argument can specify an alternate default.
777 key, default and the result are bytes."""
778 return environb.get(key, default)
Victor Stinner70120e22010-07-29 17:19:38 +0000779
780 __all__.extend(("environb", "getenvb"))
Victor Stinner84ae1182010-05-06 22:05:07 +0000781
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000782def _fscodec():
783 encoding = sys.getfilesystemencoding()
784 if encoding == 'mbcs':
Victor Stinnere882aac2010-10-24 21:12:26 +0000785 errors = 'strict'
Victor Stinner313a1202010-06-11 23:56:51 +0000786 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000787 errors = 'surrogateescape'
Victor Stinnere8d51452010-08-19 01:05:19 +0000788
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000789 def fsencode(filename):
790 """
791 Encode filename to the filesystem encoding with 'surrogateescape' error
792 handler, return bytes unchanged. On Windows, use 'strict' error handler if
793 the file system encoding is 'mbcs' (which is the default encoding).
794 """
795 if isinstance(filename, bytes):
796 return filename
797 elif isinstance(filename, str):
798 return filename.encode(encoding, errors)
Victor Stinnere8d51452010-08-19 01:05:19 +0000799 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000800 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
801
802 def fsdecode(filename):
803 """
804 Decode filename from the filesystem encoding with 'surrogateescape' error
805 handler, return str unchanged. On Windows, use 'strict' error handler if
806 the file system encoding is 'mbcs' (which is the default encoding).
807 """
808 if isinstance(filename, str):
809 return filename
810 elif isinstance(filename, bytes):
811 return filename.decode(encoding, errors)
812 else:
813 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
814
815 return fsencode, fsdecode
816
817fsencode, fsdecode = _fscodec()
818del _fscodec
Victor Stinner449c4662010-05-08 11:10:09 +0000819
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000820# Supply spawn*() (probably only for Unix)
821if _exists("fork") and not _exists("spawnv") and _exists("execv"):
822
823 P_WAIT = 0
824 P_NOWAIT = P_NOWAITO = 1
825
Petri Lehtinen3bc37f22012-05-23 21:36:16 +0300826 __all__.extend(["P_WAIT", "P_NOWAIT", "P_NOWAITO"])
827
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000828 # XXX Should we support P_DETACH? I suppose it could fork()**2
829 # and close the std I/O streams. Also, P_OVERLAY is the same
830 # as execv*()?
831
832 def _spawnvef(mode, file, args, env, func):
833 # Internal helper; func is the exec*() function to use
834 pid = fork()
835 if not pid:
836 # Child
837 try:
838 if env is None:
839 func(file, args)
840 else:
841 func(file, args, env)
842 except:
843 _exit(127)
844 else:
845 # Parent
846 if mode == P_NOWAIT:
847 return pid # Caller is responsible for waiting!
848 while 1:
849 wpid, sts = waitpid(pid, 0)
850 if WIFSTOPPED(sts):
851 continue
852 elif WIFSIGNALED(sts):
853 return -WTERMSIG(sts)
854 elif WIFEXITED(sts):
855 return WEXITSTATUS(sts)
856 else:
Collin Winter828f04a2007-08-31 00:04:24 +0000857 raise error("Not stopped, signaled or exited???")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000858
859 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000860 """spawnv(mode, file, args) -> integer
861
862Execute file with arguments from args in a subprocess.
863If mode == P_NOWAIT return the pid of the process.
864If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000865otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000866 return _spawnvef(mode, file, args, None, execv)
867
868 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000869 """spawnve(mode, file, args, env) -> integer
870
871Execute file with arguments from args in a subprocess with the
872specified environment.
873If mode == P_NOWAIT return the pid of the process.
874If mode == P_WAIT return the process's exit code if it exits normally;
875otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000876 return _spawnvef(mode, file, args, env, execve)
877
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000878 # Note: spawnvp[e] is't currently supported on Windows
879
880 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000881 """spawnvp(mode, file, args) -> integer
882
883Execute file (which is looked for along $PATH) with arguments from
884args in a subprocess.
885If mode == P_NOWAIT return the pid of the process.
886If mode == P_WAIT return the process's exit code if it exits normally;
887otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000888 return _spawnvef(mode, file, args, None, execvp)
889
890 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000891 """spawnvpe(mode, file, args, env) -> integer
892
893Execute file (which is looked for along $PATH) with arguments from
894args in a subprocess with the supplied environment.
895If mode == P_NOWAIT return the pid of the process.
896If mode == P_WAIT return the process's exit code if it exits normally;
897otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000898 return _spawnvef(mode, file, args, env, execvpe)
899
900if _exists("spawnv"):
901 # These aren't supplied by the basic Windows code
902 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000903
904 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000905 """spawnl(mode, file, *args) -> integer
906
907Execute file with arguments from args in a subprocess.
908If mode == P_NOWAIT return the pid of the process.
909If mode == P_WAIT return the process's exit code if it exits normally;
910otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000911 return spawnv(mode, file, args)
912
913 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000914 """spawnle(mode, file, *args, env) -> integer
915
916Execute file with arguments from args in a subprocess with the
917supplied environment.
918If mode == P_NOWAIT return the pid of the process.
919If mode == P_WAIT return the process's exit code if it exits normally;
920otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000921 env = args[-1]
922 return spawnve(mode, file, args[:-1], env)
923
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000924
925 __all__.extend(["spawnv", "spawnve", "spawnl", "spawnle",])
926
927
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000928if _exists("spawnvp"):
929 # At the moment, Windows doesn't implement spawnvp[e],
930 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000931 def spawnlp(mode, file, *args):
Neal Norwitzb7f68102003-07-02 02:49:33 +0000932 """spawnlp(mode, file, *args) -> integer
Guido van Rossume0cd2912000-04-21 18:35:36 +0000933
934Execute file (which is looked for along $PATH) with arguments from
935args in a subprocess with the supplied environment.
936If mode == P_NOWAIT return the pid of the process.
937If mode == P_WAIT return the process's exit code if it exits normally;
938otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000939 return spawnvp(mode, file, args)
940
941 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000942 """spawnlpe(mode, file, *args, env) -> integer
943
944Execute file (which is looked for along $PATH) with arguments from
945args in a subprocess with the supplied environment.
946If mode == P_NOWAIT return the pid of the process.
947If mode == P_WAIT return the process's exit code if it exits normally;
948otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000949 env = args[-1]
950 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000951
952
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000953 __all__.extend(["spawnvp", "spawnvpe", "spawnlp", "spawnlpe",])
Skip Montanaro269b83b2001-02-06 01:07:02 +0000954
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000955import copyreg as _copyreg
Michael W. Hudson0e025302002-03-06 17:11:18 +0000956
957def _make_stat_result(tup, dict):
958 return stat_result(tup, dict)
959
960def _pickle_stat_result(sr):
961 (type, args) = sr.__reduce__()
962 return (_make_stat_result, args)
963
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000964try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000965 _copyreg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000966except NameError: # stat_result may not exist
967 pass
Michael W. Hudson0e025302002-03-06 17:11:18 +0000968
969def _make_statvfs_result(tup, dict):
970 return statvfs_result(tup, dict)
971
972def _pickle_statvfs_result(sr):
973 (type, args) = sr.__reduce__()
974 return (_make_statvfs_result, args)
975
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000976try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000977 _copyreg.pickle(statvfs_result, _pickle_statvfs_result,
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000978 _make_statvfs_result)
Michael W. Hudsone5363b72002-03-15 10:21:59 +0000979except NameError: # statvfs_result may not exist
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000980 pass
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000981
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000982# Supply os.popen()
Antoine Pitrou877766d2011-03-19 17:00:37 +0100983def popen(cmd, mode="r", buffering=-1):
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000984 if not isinstance(cmd, str):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000985 raise TypeError("invalid cmd type (%s, expected string)" % type(cmd))
986 if mode not in ("r", "w"):
987 raise ValueError("invalid mode %r" % mode)
Antoine Pitrou877766d2011-03-19 17:00:37 +0100988 if buffering == 0 or buffering == None:
989 raise ValueError("popen() does not support unbuffered streams")
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000990 import subprocess, io
991 if mode == "r":
992 proc = subprocess.Popen(cmd,
993 shell=True,
994 stdout=subprocess.PIPE,
995 bufsize=buffering)
996 return _wrap_close(io.TextIOWrapper(proc.stdout), proc)
997 else:
998 proc = subprocess.Popen(cmd,
999 shell=True,
1000 stdin=subprocess.PIPE,
1001 bufsize=buffering)
1002 return _wrap_close(io.TextIOWrapper(proc.stdin), proc)
1003
1004# Helper for popen() -- a proxy for a file whose close waits for the process
1005class _wrap_close:
1006 def __init__(self, stream, proc):
1007 self._stream = stream
1008 self._proc = proc
1009 def close(self):
1010 self._stream.close()
Amaury Forgeot d'Arc97e5f282009-07-11 09:35:13 +00001011 returncode = self._proc.wait()
1012 if returncode == 0:
1013 return None
1014 if name == 'nt':
1015 return returncode
1016 else:
1017 return returncode << 8 # Shift left to match old behavior
Antoine Pitrouac625352009-12-09 00:01:27 +00001018 def __enter__(self):
1019 return self
1020 def __exit__(self, *args):
1021 self.close()
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001022 def __getattr__(self, name):
1023 return getattr(self._stream, name)
Thomas Heller476157b2007-09-04 11:27:47 +00001024 def __iter__(self):
1025 return iter(self._stream)
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001026
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +00001027# Supply os.fdopen()
1028def fdopen(fd, *args, **kwargs):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001029 if not isinstance(fd, int):
1030 raise TypeError("invalid fd type (%s, expected integer)" % type(fd))
1031 import io
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +00001032 return io.open(fd, *args, **kwargs)