blob: fc8b92efbd7f4d0c011300927542d927b693a951 [file] [log] [blame]
Georg Brandlbde4ad42006-01-20 21:36:02 +00001r"""OS routines for Mac, NT, or Posix depending on what system we're on.
Guido van Rossum31104f41992-01-14 18:28:36 +00002
Guido van Rossum54f22ed2000-02-04 15:10:34 +00003This exports:
Alexandre Vassalottieca20b62008-05-16 02:54:33 +00004 - all functions from posix, nt, os2, or ce, e.g. unlink, stat, etc.
5 - os.path is either posixpath or ntpath
6 - os.name is either 'posix', 'nt', 'os2' or 'ce'.
Guido van Rossum54f22ed2000-02-04 15:10:34 +00007 - os.curdir is a string representing the current directory ('.' or ':')
8 - os.pardir is a string representing the parent directory ('..' or '::')
9 - os.sep is the (or a most common) pathname separator ('/' or ':' or '\\')
Georg Brandled5b9b32008-12-05 07:45:54 +000010 - os.extsep is the extension separator (always '.')
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +000011 - os.altsep is the alternate pathname separator (None or '/')
Guido van Rossum54f22ed2000-02-04 15:10:34 +000012 - os.pathsep is the component separator used in $PATH etc
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +000013 - os.linesep is the line separator in text files ('\r' or '\n' or '\r\n')
Guido van Rossum54f22ed2000-02-04 15:10:34 +000014 - os.defpath is the default search path for executables
Martin v. Löwisbdec50f2004-06-08 08:29:33 +000015 - os.devnull is the file path of the null device ('/dev/null', etc.)
Guido van Rossum31104f41992-01-14 18:28:36 +000016
Guido van Rossum54f22ed2000-02-04 15:10:34 +000017Programs that import and use 'os' stand a better chance of being
18portable between different platforms. Of course, they must then
19only use functions that are defined by all platforms (e.g., unlink
20and opendir), and leave all pathname manipulation to os.path
21(e.g., split and join).
22"""
Guido van Rossum31104f41992-01-14 18:28:36 +000023
Skip Montanaro269b83b2001-02-06 01:07:02 +000024#'
25
Christian Heimes45f9af32007-11-27 21:50:00 +000026import sys, errno
Charles-François Natali7372b062012-02-05 15:15:38 +010027import stat as st
Guido van Rossuma28dab51997-08-29 22:36:47 +000028
29_names = sys.builtin_module_names
30
Tim Petersc4e09402003-04-25 07:11:48 +000031# Note: more names are added to __all__ later.
Brett Cannon13962fc2008-08-18 01:45:29 +000032__all__ = ["altsep", "curdir", "pardir", "sep", "pathsep", "linesep",
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030033 "defpath", "name", "path", "devnull", "SEEK_SET", "SEEK_CUR",
34 "SEEK_END", "fsencode", "fsdecode", "get_exec_path", "fdopen",
35 "popen", "extsep"]
Skip Montanaro269b83b2001-02-06 01:07:02 +000036
Charles-François Natali7372b062012-02-05 15:15:38 +010037def _exists(name):
38 return name in globals()
39
Skip Montanaro269b83b2001-02-06 01:07:02 +000040def _get_exports_list(module):
41 try:
42 return list(module.__all__)
43 except AttributeError:
44 return [n for n in dir(module) if n[0] != '_']
45
Brett Cannonfd074152012-04-14 14:10:13 -040046# Any new dependencies of the os module and/or changes in path separator
47# requires updating importlib as well.
Guido van Rossuma28dab51997-08-29 22:36:47 +000048if 'posix' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000049 name = 'posix'
Guido van Rossume9387ea1998-05-22 15:26:04 +000050 linesep = '\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000051 from posix import *
52 try:
53 from posix import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030054 __all__.append('_exit')
Guido van Rossum61de0ac1997-12-05 21:24:30 +000055 except ImportError:
56 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000057 import posixpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000058
Larry Hastings9cf065c2012-06-22 16:30:09 -070059 try:
60 from posix import _have_functions
61 except ImportError:
62 pass
Skip Montanaro269b83b2001-02-06 01:07:02 +000063
Guido van Rossuma28dab51997-08-29 22:36:47 +000064elif 'nt' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000065 name = 'nt'
Guido van Rossume9387ea1998-05-22 15:26:04 +000066 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000067 from nt import *
Tim Peters6757c1e2003-01-08 21:20:57 +000068 try:
69 from nt import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030070 __all__.append('_exit')
Tim Peters6757c1e2003-01-08 21:20:57 +000071 except ImportError:
72 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000073 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000074
Skip Montanaro269b83b2001-02-06 01:07:02 +000075 import nt
76 __all__.extend(_get_exports_list(nt))
77 del nt
78
Larry Hastings9cf065c2012-06-22 16:30:09 -070079 try:
80 from nt import _have_functions
81 except ImportError:
82 pass
83
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000084elif 'os2' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000085 name = 'os2'
Guido van Rossume9387ea1998-05-22 15:26:04 +000086 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000087 from os2 import *
88 try:
89 from os2 import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030090 __all__.append('_exit')
Guido van Rossum61de0ac1997-12-05 21:24:30 +000091 except ImportError:
92 pass
Andrew MacIntyre5cef5712002-02-24 05:32:32 +000093 if sys.version.find('EMX GCC') == -1:
Skip Montanaro117910d2003-02-14 19:35:31 +000094 import ntpath as path
Andrew MacIntyre5cef5712002-02-24 05:32:32 +000095 else:
Skip Montanaro117910d2003-02-14 19:35:31 +000096 import os2emxpath as path
Andrew MacIntyre89f98652003-12-02 12:33:01 +000097 from _emx_link import link
Tim Petersf2715e02003-02-19 02:35:07 +000098
Skip Montanaro269b83b2001-02-06 01:07:02 +000099 import os2
100 __all__.extend(_get_exports_list(os2))
101 del os2
102
Larry Hastings9cf065c2012-06-22 16:30:09 -0700103 try:
104 from os2 import _have_functions
105 except ImportError:
106 pass
107
Guido van Rossum18df5d41999-06-11 01:37:27 +0000108elif 'ce' in _names:
109 name = 'ce'
110 linesep = '\r\n'
Guido van Rossum18df5d41999-06-11 01:37:27 +0000111 from ce import *
Tim Peters6757c1e2003-01-08 21:20:57 +0000112 try:
113 from ce import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +0300114 __all__.append('_exit')
Tim Peters6757c1e2003-01-08 21:20:57 +0000115 except ImportError:
116 pass
Guido van Rossum18df5d41999-06-11 01:37:27 +0000117 # We can use the standard Windows path.
Skip Montanaro117910d2003-02-14 19:35:31 +0000118 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +0000119
Skip Montanaro269b83b2001-02-06 01:07:02 +0000120 import ce
121 __all__.extend(_get_exports_list(ce))
122 del ce
123
Larry Hastings9cf065c2012-06-22 16:30:09 -0700124 try:
125 from ce import _have_functions
126 except ImportError:
127 pass
128
Guido van Rossum2979b011994-08-01 11:18:30 +0000129else:
Collin Winter828f04a2007-08-31 00:04:24 +0000130 raise ImportError('no os specific module found')
Guido van Rossume65cce51993-11-08 15:05:21 +0000131
Skip Montanaro117910d2003-02-14 19:35:31 +0000132sys.modules['os.path'] = path
Georg Brandled5b9b32008-12-05 07:45:54 +0000133from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep,
134 devnull)
Skip Montanaro269b83b2001-02-06 01:07:02 +0000135
Guido van Rossuma28dab51997-08-29 22:36:47 +0000136del _names
137
Larry Hastings9cf065c2012-06-22 16:30:09 -0700138
139if _exists("_have_functions"):
140 _globals = globals()
141 def _add(str, fn):
142 if (fn in _globals) and (str in _have_functions):
143 _set.add(_globals[fn])
144
145 _set = set()
146 _add("HAVE_FACCESSAT", "access")
147 _add("HAVE_FCHMODAT", "chmod")
148 _add("HAVE_FCHOWNAT", "chown")
149 _add("HAVE_FSTATAT", "stat")
150 _add("HAVE_FUTIMESAT", "utime")
151 _add("HAVE_LINKAT", "link")
152 _add("HAVE_MKDIRAT", "mkdir")
153 _add("HAVE_MKFIFOAT", "mkfifo")
154 _add("HAVE_MKNODAT", "mknod")
155 _add("HAVE_OPENAT", "open")
156 _add("HAVE_READLINKAT", "readlink")
157 _add("HAVE_RENAMEAT", "rename")
158 _add("HAVE_SYMLINKAT", "symlink")
159 _add("HAVE_UNLINKAT", "unlink")
160 _add("HAVE_UTIMENSAT", "utime")
161 supports_dir_fd = _set
162
163 _set = set()
164 _add("HAVE_FACCESSAT", "access")
165 supports_effective_ids = _set
166
167 _set = set()
168 _add("HAVE_FCHDIR", "chdir")
169 _add("HAVE_FCHMOD", "chmod")
170 _add("HAVE_FCHOWN", "chown")
171 _add("HAVE_FDOPENDIR", "listdir")
172 _add("HAVE_FEXECVE", "execve")
173 _set.add(stat) # fstat always works
174 _add("HAVE_FUTIMENS", "utime")
175 _add("HAVE_FUTIMES", "utime")
176 if _exists("statvfs") and _exists("fstatvfs"): # mac os x10.3
177 _add("HAVE_FSTATVFS", "statvfs")
178 supports_fd = _set
179
180 _set = set()
181 _add("HAVE_FACCESSAT", "access")
182 # Current linux (kernel 3.2, glibc 2.15) doesn't support lchmod.
183 # (The function exists, but it's a stub that always returns ENOSUP.)
184 # Now, linux *does* have fchmodat, which says it can ignore
185 # symbolic links. But that doesn't work either (also returns ENOSUP).
186 # I'm guessing that if they fix fchmodat, they'll also add lchmod at
187 # the same time. So, for now, assume that fchmodat doesn't support
188 # follow_symlinks unless lchmod works.
189 if ((sys.platform != "linux") or
190 ("HAVE_LCHMOD" in _have_functions)):
191 _add("HAVE_FCHMODAT", "chmod")
192 _add("HAVE_FCHOWNAT", "chown")
193 _add("HAVE_FSTATAT", "stat")
194 _add("HAVE_LCHFLAGS", "chflags")
195 _add("HAVE_LCHMOD", "chmod")
196 if _exists("lchown"): # mac os x10.3
197 _add("HAVE_LCHOWN", "chown")
198 _add("HAVE_LINKAT", "link")
199 _add("HAVE_LUTIMES", "utime")
200 _add("HAVE_LSTAT", "stat")
201 _add("HAVE_FSTATAT", "stat")
202 _add("HAVE_UTIMENSAT", "utime")
203 _add("MS_WINDOWS", "stat")
204 supports_follow_symlinks = _set
205
206 _set = set()
207 _add("HAVE_UNLINKAT", "unlink")
208 supports_remove_directory = _set
209
210 del _set
211 del _have_functions
212 del _globals
213 del _add
214
215
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000216# Python uses fixed values for the SEEK_ constants; they are mapped
217# to native constants if necessary in posixmodule.c
Jesus Cea94363612012-06-22 18:32:07 +0200218# Other possible SEEK values are directly imported from posixmodule.c
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000219SEEK_SET = 0
220SEEK_CUR = 1
221SEEK_END = 2
222
Terry Reedy5a22b652010-12-02 07:05:56 +0000223
224def _get_masked_mode(mode):
225 mask = umask(0)
226 umask(mask)
227 return mode & ~mask
228
Guido van Rossum4def7de1998-07-24 20:48:03 +0000229# Super directory utilities.
230# (Inspired by Eric Raymond; the doc strings are mostly his)
231
Terry Reedy5a22b652010-12-02 07:05:56 +0000232def makedirs(name, mode=0o777, exist_ok=False):
233 """makedirs(path [, mode=0o777][, exist_ok=False])
Guido van Rossum4def7de1998-07-24 20:48:03 +0000234
235 Super-mkdir; create a leaf directory and all intermediate ones.
236 Works like mkdir, except that any intermediate path segment (not
Terry Reedy5a22b652010-12-02 07:05:56 +0000237 just the rightmost) will be created if it does not exist. If the
238 target directory with the same mode as we specified already exists,
239 raises an OSError if exist_ok is False, otherwise no exception is
240 raised. This is recursive.
Guido van Rossum4def7de1998-07-24 20:48:03 +0000241
242 """
243 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000244 if not tail:
245 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000246 if head and tail and not path.exists(head):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000247 try:
Terry Reedy5a22b652010-12-02 07:05:56 +0000248 makedirs(head, mode, exist_ok)
Guido van Rossumb940e112007-01-10 16:19:56 +0000249 except OSError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000250 # be happy if someone already created the path
Christian Heimes45f9af32007-11-27 21:50:00 +0000251 if e.errno != errno.EEXIST:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000252 raise
Andrew M. Kuchling6fccc8a2003-12-23 16:33:28 +0000253 if tail == curdir: # xxx/newdir/. exists if xxx/newdir exists
254 return
Terry Reedy5a22b652010-12-02 07:05:56 +0000255 try:
256 mkdir(name, mode)
257 except OSError as e:
Gregory P. Smitha81c8562012-06-03 14:30:44 -0700258 dir_exists = path.isdir(name)
259 expected_mode = _get_masked_mode(mode)
260 if dir_exists:
261 # S_ISGID is automatically copied by the OS from parent to child
262 # directories on mkdir. Don't consider it being set to be a mode
263 # mismatch as mkdir does not unset it when not specified in mode.
264 actual_mode = st.S_IMODE(lstat(name).st_mode) & ~st.S_ISGID
265 else:
266 actual_mode = -1
267 if not (e.errno == errno.EEXIST and exist_ok and dir_exists and
268 actual_mode == expected_mode):
269 if dir_exists and actual_mode != expected_mode:
270 e.strerror += ' (mode %o != expected mode %o)' % (
271 actual_mode, expected_mode)
Terry Reedy5a22b652010-12-02 07:05:56 +0000272 raise
Guido van Rossum4def7de1998-07-24 20:48:03 +0000273
274def removedirs(name):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000275 """removedirs(path)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000276
Fredrik Lundh96c1c7a2005-11-12 15:55:04 +0000277 Super-rmdir; remove a leaf directory and all empty intermediate
Guido van Rossum4def7de1998-07-24 20:48:03 +0000278 ones. Works like rmdir except that, if the leaf directory is
279 successfully removed, directories corresponding to rightmost path
Tim Petersc4e09402003-04-25 07:11:48 +0000280 segments will be pruned away until either the whole path is
Guido van Rossum4def7de1998-07-24 20:48:03 +0000281 consumed or an error occurs. Errors during this latter phase are
282 ignored -- they generally mean that a directory was not empty.
283
284 """
285 rmdir(name)
286 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000287 if not tail:
288 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000289 while head and tail:
290 try:
291 rmdir(head)
292 except error:
293 break
294 head, tail = path.split(head)
295
296def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000297 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000298
299 Super-rename; create directories as necessary and delete any left
300 empty. Works like rename, except creation of any intermediate
301 directories needed to make the new pathname good is attempted
302 first. After the rename, directories corresponding to rightmost
303 path segments of the old name will be pruned way until either the
304 whole path is consumed or a nonempty directory is found.
305
306 Note: this function can fail with the new directory structure made
307 if you lack permissions needed to unlink the leaf directory or
308 file.
309
310 """
311 head, tail = path.split(new)
312 if head and tail and not path.exists(head):
313 makedirs(head)
314 rename(old, new)
315 head, tail = path.split(old)
316 if head and tail:
317 try:
318 removedirs(head)
319 except error:
320 pass
321
Skip Montanaro269b83b2001-02-06 01:07:02 +0000322__all__.extend(["makedirs", "removedirs", "renames"])
323
Guido van Rossumd8faa362007-04-27 19:54:29 +0000324def walk(top, topdown=True, onerror=None, followlinks=False):
Tim Petersc4e09402003-04-25 07:11:48 +0000325 """Directory tree generator.
326
327 For each directory in the directory tree rooted at top (including top
328 itself, but excluding '.' and '..'), yields a 3-tuple
329
330 dirpath, dirnames, filenames
331
332 dirpath is a string, the path to the directory. dirnames is a list of
333 the names of the subdirectories in dirpath (excluding '.' and '..').
334 filenames is a list of the names of the non-directory files in dirpath.
335 Note that the names in the lists are just names, with no path components.
336 To get a full path (which begins with top) to a file or directory in
337 dirpath, do os.path.join(dirpath, name).
338
339 If optional arg 'topdown' is true or not specified, the triple for a
340 directory is generated before the triples for any of its subdirectories
341 (directories are generated top down). If topdown is false, the triple
342 for a directory is generated after the triples for all of its
343 subdirectories (directories are generated bottom up).
344
345 When topdown is true, the caller can modify the dirnames list in-place
346 (e.g., via del or slice assignment), and walk will only recurse into the
347 subdirectories whose names remain in dirnames; this can be used to prune
348 the search, or to impose a specific order of visiting. Modifying
349 dirnames when topdown is false is ineffective, since the directories in
350 dirnames have already been generated by the time dirnames itself is
351 generated.
352
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000353 By default errors from the os.listdir() call are ignored. If
354 optional arg 'onerror' is specified, it should be a function; it
355 will be called with one argument, an os.error instance. It can
356 report the error to continue with the walk, or raise the exception
357 to abort the walk. Note that the filename is available as the
358 filename attribute of the exception object.
359
Guido van Rossumd8faa362007-04-27 19:54:29 +0000360 By default, os.walk does not follow symbolic links to subdirectories on
361 systems that support them. In order to get this functionality, set the
362 optional argument 'followlinks' to true.
363
Tim Petersc4e09402003-04-25 07:11:48 +0000364 Caution: if you pass a relative pathname for top, don't change the
365 current working directory between resumptions of walk. walk never
366 changes the current directory, and assumes that the client doesn't
367 either.
368
369 Example:
370
Christian Heimes5d8da202008-05-06 13:58:24 +0000371 import os
Tim Petersc4e09402003-04-25 07:11:48 +0000372 from os.path import join, getsize
Christian Heimes5d8da202008-05-06 13:58:24 +0000373 for root, dirs, files in os.walk('python/Lib/email'):
Neal Norwitz752abd02008-05-13 04:55:24 +0000374 print(root, "consumes", end="")
375 print(sum([getsize(join(root, name)) for name in files]), end="")
376 print("bytes in", len(files), "non-directory files")
Tim Petersc4e09402003-04-25 07:11:48 +0000377 if 'CVS' in dirs:
378 dirs.remove('CVS') # don't visit CVS directories
379 """
380
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000381 islink, join, isdir = path.islink, path.join, path.isdir
Tim Petersc4e09402003-04-25 07:11:48 +0000382
383 # We may not have read permission for top, in which case we can't
Alexandre Vassalotti4e6531e2008-05-09 20:00:17 +0000384 # get a list of the files the directory contains. os.walk
Tim Petersc4e09402003-04-25 07:11:48 +0000385 # always suppressed the exception then, rather than blow up for a
386 # minor reason when (say) a thousand readable directories are still
387 # left to visit. That logic is copied here.
388 try:
389 # Note that listdir and error are globals in this module due
390 # to earlier import-*.
391 names = listdir(top)
Guido van Rossumb940e112007-01-10 16:19:56 +0000392 except error as err:
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000393 if onerror is not None:
394 onerror(err)
Tim Petersc4e09402003-04-25 07:11:48 +0000395 return
396
397 dirs, nondirs = [], []
398 for name in names:
399 if isdir(join(top, name)):
400 dirs.append(name)
401 else:
402 nondirs.append(name)
403
404 if topdown:
405 yield top, dirs, nondirs
406 for name in dirs:
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000407 new_path = join(top, name)
408 if followlinks or not islink(new_path):
Benjamin Peterson569d0872012-05-10 16:17:35 -0500409 yield from walk(new_path, topdown, onerror, followlinks)
Tim Petersc4e09402003-04-25 07:11:48 +0000410 if not topdown:
411 yield top, dirs, nondirs
412
413__all__.append("walk")
414
Larry Hastings9cf065c2012-06-22 16:30:09 -0700415if open in supports_dir_fd:
Charles-François Natali7372b062012-02-05 15:15:38 +0100416
417 def fwalk(top, topdown=True, onerror=None, followlinks=False):
418 """Directory tree generator.
419
420 This behaves exactly like walk(), except that it yields a 4-tuple
421
422 dirpath, dirnames, filenames, dirfd
423
424 `dirpath`, `dirnames` and `filenames` are identical to walk() output,
425 and `dirfd` is a file descriptor referring to the directory `dirpath`.
426
427 The advantage of walkfd() over walk() is that it's safe against symlink
428 races (when followlinks is False).
429
430 Caution:
431 Since fwalk() yields file descriptors, those are only valid until the
432 next iteration step, so you should dup() them if you want to keep them
433 for a longer period.
434
435 Example:
436
437 import os
438 for root, dirs, files, rootfd in os.fwalk('python/Lib/email'):
439 print(root, "consumes", end="")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700440 print(sum([os.stat(name, dir_fd=rootfd).st_size for name in files]),
Charles-François Natali7372b062012-02-05 15:15:38 +0100441 end="")
442 print("bytes in", len(files), "non-directory files")
443 if 'CVS' in dirs:
444 dirs.remove('CVS') # don't visit CVS directories
445 """
446 # Note: To guard against symlink races, we use the standard
447 # lstat()/open()/fstat() trick.
448 orig_st = lstat(top)
449 topfd = open(top, O_RDONLY)
450 try:
451 if (followlinks or (st.S_ISDIR(orig_st.st_mode) and
Charles-François Natali84c0ca02012-04-22 15:55:43 +0200452 path.samestat(orig_st, fstat(topfd)))):
Benjamin Peterson569d0872012-05-10 16:17:35 -0500453 yield from _fwalk(topfd, top, topdown, onerror, followlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100454 finally:
455 close(topfd)
456
457 def _fwalk(topfd, toppath, topdown, onerror, followlinks):
458 # Note: This uses O(depth of the directory tree) file descriptors: if
459 # necessary, it can be adapted to only require O(1) FDs, see issue
460 # #13734.
461
Larry Hastings9cf065c2012-06-22 16:30:09 -0700462 names = listdir(topfd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100463 dirs, nondirs = [], []
464 for name in names:
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200465 try:
466 # Here, we don't use AT_SYMLINK_NOFOLLOW to be consistent with
467 # walk() which reports symlinks to directories as directories.
468 # We do however check for symlinks before recursing into
469 # a subdirectory.
Larry Hastings9cf065c2012-06-22 16:30:09 -0700470 if st.S_ISDIR(stat(name, dir_fd=topfd).st_mode):
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200471 dirs.append(name)
472 else:
473 nondirs.append(name)
474 except FileNotFoundError:
475 try:
476 # Add dangling symlinks, ignore disappeared files
Larry Hastings9cf065c2012-06-22 16:30:09 -0700477 if st.S_ISLNK(stat(name, dir_fd=topfd, follow_symlinks=False)
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200478 .st_mode):
479 nondirs.append(name)
480 except FileNotFoundError:
481 continue
Charles-François Natali7372b062012-02-05 15:15:38 +0100482
483 if topdown:
484 yield toppath, dirs, nondirs, topfd
485
486 for name in dirs:
487 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700488 orig_st = stat(name, dir_fd=topfd, follow_symlinks=followlinks)
489 dirfd = open(name, O_RDONLY, dir_fd=topfd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100490 except error as err:
491 if onerror is not None:
492 onerror(err)
493 return
494 try:
Charles-François Natali84c0ca02012-04-22 15:55:43 +0200495 if followlinks or path.samestat(orig_st, fstat(dirfd)):
Charles-François Natali7372b062012-02-05 15:15:38 +0100496 dirpath = path.join(toppath, name)
Benjamin Peterson569d0872012-05-10 16:17:35 -0500497 yield from _fwalk(dirfd, dirpath, topdown, onerror, followlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100498 finally:
499 close(dirfd)
500
501 if not topdown:
502 yield toppath, dirs, nondirs, topfd
503
504 __all__.append("fwalk")
505
Guido van Rossuma28dab51997-08-29 22:36:47 +0000506# Make sure os.environ exists, at least
507try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000508 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000509except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000510 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000511
Guido van Rossume65cce51993-11-08 15:05:21 +0000512def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000513 """execl(file, *args)
514
515 Execute the executable file with argument list args, replacing the
516 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000517 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000518
519def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000520 """execle(file, *args, env)
521
522 Execute the executable file with argument list args and
523 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000524 env = args[-1]
525 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000526
527def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000528 """execlp(file, *args)
529
530 Execute the executable file (which is searched for along $PATH)
531 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000532 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000533
Guido van Rossum030afb11995-03-14 17:27:18 +0000534def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000535 """execlpe(file, *args, env)
536
537 Execute the executable file (which is searched for along $PATH)
538 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000539 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000540 env = args[-1]
541 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000542
Guido van Rossume65cce51993-11-08 15:05:21 +0000543def execvp(file, args):
Matthias Klosea09c54f2010-01-31 16:48:44 +0000544 """execvp(file, args)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000545
546 Execute the executable file (which is searched for along $PATH)
547 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000548 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000549 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000550
551def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000552 """execvpe(file, args, env)
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 and environment env , replacing the
556 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000557 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000558 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000559
Skip Montanaro269b83b2001-02-06 01:07:02 +0000560__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
561
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000562def _execvpe(file, args, env=None):
563 if env is not None:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000564 exec_func = execve
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000565 argrest = (args, env)
566 else:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000567 exec_func = execv
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000568 argrest = (args,)
569 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000570
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000571 head, tail = path.split(file)
572 if head:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000573 exec_func(file, *argrest)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000574 return
Guido van Rossume7ba4952007-06-06 23:52:48 +0000575 last_exc = saved_exc = None
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000576 saved_tb = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000577 path_list = get_exec_path(env)
578 if name != 'nt':
579 file = fsencode(file)
580 path_list = map(fsencode, path_list)
581 for dir in path_list:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000582 fullname = path.join(dir, file)
583 try:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000584 exec_func(fullname, *argrest)
Guido van Rossumb940e112007-01-10 16:19:56 +0000585 except error as e:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000586 last_exc = e
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000587 tb = sys.exc_info()[2]
Christian Heimes45f9af32007-11-27 21:50:00 +0000588 if (e.errno != errno.ENOENT and e.errno != errno.ENOTDIR
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000589 and saved_exc is None):
590 saved_exc = e
591 saved_tb = tb
592 if saved_exc:
Benjamin Peterson4b068192009-02-20 03:19:25 +0000593 raise saved_exc.with_traceback(saved_tb)
594 raise last_exc.with_traceback(tb)
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000595
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000596
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000597def get_exec_path(env=None):
598 """Returns the sequence of directories that will be searched for the
599 named executable (similar to a shell) when launching a process.
600
601 *env* must be an environment variable dict or None. If *env* is None,
602 os.environ will be used.
603 """
Victor Stinner273b7662010-11-06 12:59:33 +0000604 # Use a local import instead of a global import to limit the number of
605 # modules loaded at startup: the os module is always loaded at startup by
606 # Python. It may also avoid a bootstrap issue.
Victor Stinner6f35eda2010-10-29 00:38:58 +0000607 import warnings
608
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000609 if env is None:
610 env = environ
Victor Stinnerb745a742010-05-18 17:17:23 +0000611
Victor Stinnerbb4f2182010-11-07 15:43:39 +0000612 # {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a
613 # BytesWarning when using python -b or python -bb: ignore the warning
Victor Stinner273b7662010-11-06 12:59:33 +0000614 with warnings.catch_warnings():
615 warnings.simplefilter("ignore", BytesWarning)
Victor Stinnerb745a742010-05-18 17:17:23 +0000616
Victor Stinnerb745a742010-05-18 17:17:23 +0000617 try:
Victor Stinner273b7662010-11-06 12:59:33 +0000618 path_list = env.get('PATH')
619 except TypeError:
620 path_list = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000621
Victor Stinner273b7662010-11-06 12:59:33 +0000622 if supports_bytes_environ:
623 try:
624 path_listb = env[b'PATH']
625 except (KeyError, TypeError):
626 pass
627 else:
628 if path_list is not None:
629 raise ValueError(
630 "env cannot contain 'PATH' and b'PATH' keys")
631 path_list = path_listb
632
633 if path_list is not None and isinstance(path_list, bytes):
634 path_list = fsdecode(path_list)
Victor Stinnerb745a742010-05-18 17:17:23 +0000635
636 if path_list is None:
637 path_list = defpath
638 return path_list.split(pathsep)
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000639
640
Skip Montanaro289bc052007-08-17 02:30:27 +0000641# Change environ to automatically call putenv(), unsetenv if they exist.
Raymond Hettinger158c9c22011-02-22 00:41:50 +0000642from collections.abc import MutableMapping
Skip Montanaro289bc052007-08-17 02:30:27 +0000643
644class _Environ(MutableMapping):
Victor Stinner84ae1182010-05-06 22:05:07 +0000645 def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv):
646 self.encodekey = encodekey
647 self.decodekey = decodekey
648 self.encodevalue = encodevalue
649 self.decodevalue = decodevalue
Skip Montanaro289bc052007-08-17 02:30:27 +0000650 self.putenv = putenv
651 self.unsetenv = unsetenv
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000652 self._data = data
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000653
Skip Montanaro289bc052007-08-17 02:30:27 +0000654 def __getitem__(self, key):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000655 value = self._data[self.encodekey(key)]
Victor Stinner84ae1182010-05-06 22:05:07 +0000656 return self.decodevalue(value)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000657
Skip Montanaro289bc052007-08-17 02:30:27 +0000658 def __setitem__(self, key, value):
Victor Stinner84ae1182010-05-06 22:05:07 +0000659 key = self.encodekey(key)
660 value = self.encodevalue(value)
Skip Montanaro289bc052007-08-17 02:30:27 +0000661 self.putenv(key, value)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000662 self._data[key] = value
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000663
Skip Montanaro289bc052007-08-17 02:30:27 +0000664 def __delitem__(self, key):
Victor Stinner84ae1182010-05-06 22:05:07 +0000665 key = self.encodekey(key)
Skip Montanaro289bc052007-08-17 02:30:27 +0000666 self.unsetenv(key)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000667 del self._data[key]
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000668
Skip Montanaro289bc052007-08-17 02:30:27 +0000669 def __iter__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000670 for key in self._data:
Victor Stinner84ae1182010-05-06 22:05:07 +0000671 yield self.decodekey(key)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000672
Skip Montanaro289bc052007-08-17 02:30:27 +0000673 def __len__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000674 return len(self._data)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000675
676 def __repr__(self):
Victor Stinnerbed71172010-07-28 21:25:42 +0000677 return 'environ({{{}}})'.format(', '.join(
Victor Stinnerd73c1a32010-07-28 21:23:23 +0000678 ('{!r}: {!r}'.format(self.decodekey(key), self.decodevalue(value))
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000679 for key, value in self._data.items())))
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000680
Skip Montanaro289bc052007-08-17 02:30:27 +0000681 def copy(self):
682 return dict(self)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000683
Skip Montanaro289bc052007-08-17 02:30:27 +0000684 def setdefault(self, key, value):
685 if key not in self:
686 self[key] = value
687 return self[key]
688
689try:
690 _putenv = putenv
691except NameError:
692 _putenv = lambda key, value: None
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000693else:
Skip Montanaro289bc052007-08-17 02:30:27 +0000694 __all__.append("putenv")
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000695
Skip Montanaro289bc052007-08-17 02:30:27 +0000696try:
697 _unsetenv = unsetenv
698except NameError:
699 _unsetenv = lambda key: _putenv(key, "")
700else:
701 __all__.append("unsetenv")
Guido van Rossumc524d952001-10-19 01:31:59 +0000702
Victor Stinner84ae1182010-05-06 22:05:07 +0000703def _createenviron():
704 if name in ('os2', 'nt'):
705 # Where Env Var Names Must Be UPPERCASE
706 def check_str(value):
707 if not isinstance(value, str):
708 raise TypeError("str expected, not %s" % type(value).__name__)
709 return value
710 encode = check_str
711 decode = str
712 def encodekey(key):
713 return encode(key).upper()
714 data = {}
715 for key, value in environ.items():
716 data[encodekey(key)] = value
717 else:
718 # Where Env Var Names Can Be Mixed Case
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000719 encoding = sys.getfilesystemencoding()
Victor Stinner84ae1182010-05-06 22:05:07 +0000720 def encode(value):
721 if not isinstance(value, str):
722 raise TypeError("str expected, not %s" % type(value).__name__)
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000723 return value.encode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000724 def decode(value):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000725 return value.decode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000726 encodekey = encode
727 data = environ
728 return _Environ(data,
729 encodekey, decode,
730 encode, decode,
731 _putenv, _unsetenv)
Guido van Rossumc524d952001-10-19 01:31:59 +0000732
Victor Stinner84ae1182010-05-06 22:05:07 +0000733# unicode environ
734environ = _createenviron()
735del _createenviron
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000736
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000737
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000738def getenv(key, default=None):
Tim Peters2c60f7a2003-01-29 03:49:43 +0000739 """Get an environment variable, return None if it doesn't exist.
Victor Stinner84ae1182010-05-06 22:05:07 +0000740 The optional second argument can specify an alternate default.
741 key, default and the result are str."""
Tim Peters2c60f7a2003-01-29 03:49:43 +0000742 return environ.get(key, default)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000743
Victor Stinnerb745a742010-05-18 17:17:23 +0000744supports_bytes_environ = name not in ('os2', 'nt')
745__all__.extend(("getenv", "supports_bytes_environ"))
746
747if supports_bytes_environ:
Victor Stinner84ae1182010-05-06 22:05:07 +0000748 def _check_bytes(value):
749 if not isinstance(value, bytes):
750 raise TypeError("bytes expected, not %s" % type(value).__name__)
751 return value
752
753 # bytes environ
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000754 environb = _Environ(environ._data,
Victor Stinner84ae1182010-05-06 22:05:07 +0000755 _check_bytes, bytes,
756 _check_bytes, bytes,
757 _putenv, _unsetenv)
758 del _check_bytes
759
760 def getenvb(key, default=None):
761 """Get an environment variable, return None if it doesn't exist.
762 The optional second argument can specify an alternate default.
763 key, default and the result are bytes."""
764 return environb.get(key, default)
Victor Stinner70120e22010-07-29 17:19:38 +0000765
766 __all__.extend(("environb", "getenvb"))
Victor Stinner84ae1182010-05-06 22:05:07 +0000767
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000768def _fscodec():
769 encoding = sys.getfilesystemencoding()
770 if encoding == 'mbcs':
Victor Stinnere882aac2010-10-24 21:12:26 +0000771 errors = 'strict'
Victor Stinner313a1202010-06-11 23:56:51 +0000772 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000773 errors = 'surrogateescape'
Victor Stinnere8d51452010-08-19 01:05:19 +0000774
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000775 def fsencode(filename):
776 """
777 Encode filename to the filesystem encoding with 'surrogateescape' error
778 handler, return bytes unchanged. On Windows, use 'strict' error handler if
779 the file system encoding is 'mbcs' (which is the default encoding).
780 """
781 if isinstance(filename, bytes):
782 return filename
783 elif isinstance(filename, str):
784 return filename.encode(encoding, errors)
Victor Stinnere8d51452010-08-19 01:05:19 +0000785 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000786 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
787
788 def fsdecode(filename):
789 """
790 Decode filename from the filesystem encoding with 'surrogateescape' error
791 handler, return str unchanged. On Windows, use 'strict' error handler if
792 the file system encoding is 'mbcs' (which is the default encoding).
793 """
794 if isinstance(filename, str):
795 return filename
796 elif isinstance(filename, bytes):
797 return filename.decode(encoding, errors)
798 else:
799 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
800
801 return fsencode, fsdecode
802
803fsencode, fsdecode = _fscodec()
804del _fscodec
Victor Stinner449c4662010-05-08 11:10:09 +0000805
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000806# Supply spawn*() (probably only for Unix)
807if _exists("fork") and not _exists("spawnv") and _exists("execv"):
808
809 P_WAIT = 0
810 P_NOWAIT = P_NOWAITO = 1
811
Petri Lehtinen3bc37f22012-05-23 21:36:16 +0300812 __all__.extend(["P_WAIT", "P_NOWAIT", "P_NOWAITO"])
813
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000814 # XXX Should we support P_DETACH? I suppose it could fork()**2
815 # and close the std I/O streams. Also, P_OVERLAY is the same
816 # as execv*()?
817
818 def _spawnvef(mode, file, args, env, func):
819 # Internal helper; func is the exec*() function to use
820 pid = fork()
821 if not pid:
822 # Child
823 try:
824 if env is None:
825 func(file, args)
826 else:
827 func(file, args, env)
828 except:
829 _exit(127)
830 else:
831 # Parent
832 if mode == P_NOWAIT:
833 return pid # Caller is responsible for waiting!
834 while 1:
835 wpid, sts = waitpid(pid, 0)
836 if WIFSTOPPED(sts):
837 continue
838 elif WIFSIGNALED(sts):
839 return -WTERMSIG(sts)
840 elif WIFEXITED(sts):
841 return WEXITSTATUS(sts)
842 else:
Collin Winter828f04a2007-08-31 00:04:24 +0000843 raise error("Not stopped, signaled or exited???")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000844
845 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000846 """spawnv(mode, file, args) -> integer
847
848Execute file with arguments from args in a subprocess.
849If mode == P_NOWAIT return the pid of the process.
850If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000851otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000852 return _spawnvef(mode, file, args, None, execv)
853
854 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000855 """spawnve(mode, file, args, env) -> integer
856
857Execute file with arguments from args in a subprocess with the
858specified environment.
859If mode == P_NOWAIT return the pid of the process.
860If mode == P_WAIT return the process's exit code if it exits normally;
861otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000862 return _spawnvef(mode, file, args, env, execve)
863
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000864 # Note: spawnvp[e] is't currently supported on Windows
865
866 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000867 """spawnvp(mode, file, args) -> integer
868
869Execute file (which is looked for along $PATH) with arguments from
870args in a subprocess.
871If mode == P_NOWAIT return the pid of the process.
872If mode == P_WAIT return the process's exit code if it exits normally;
873otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000874 return _spawnvef(mode, file, args, None, execvp)
875
876 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000877 """spawnvpe(mode, file, args, env) -> integer
878
879Execute file (which is looked for along $PATH) with arguments from
880args in a subprocess with the supplied environment.
881If mode == P_NOWAIT return the pid of the process.
882If mode == P_WAIT return the process's exit code if it exits normally;
883otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000884 return _spawnvef(mode, file, args, env, execvpe)
885
886if _exists("spawnv"):
887 # These aren't supplied by the basic Windows code
888 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000889
890 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000891 """spawnl(mode, file, *args) -> integer
892
893Execute file with arguments from args in a subprocess.
894If mode == P_NOWAIT return the pid of the process.
895If mode == P_WAIT return the process's exit code if it exits normally;
896otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000897 return spawnv(mode, file, args)
898
899 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000900 """spawnle(mode, file, *args, env) -> integer
901
902Execute file with arguments from args in a subprocess with the
903supplied environment.
904If mode == P_NOWAIT return the pid of the process.
905If mode == P_WAIT return the process's exit code if it exits normally;
906otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000907 env = args[-1]
908 return spawnve(mode, file, args[:-1], env)
909
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000910
911 __all__.extend(["spawnv", "spawnve", "spawnl", "spawnle",])
912
913
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000914if _exists("spawnvp"):
915 # At the moment, Windows doesn't implement spawnvp[e],
916 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000917 def spawnlp(mode, file, *args):
Neal Norwitzb7f68102003-07-02 02:49:33 +0000918 """spawnlp(mode, file, *args) -> integer
Guido van Rossume0cd2912000-04-21 18:35:36 +0000919
920Execute file (which is looked for along $PATH) with arguments from
921args in a subprocess with the supplied environment.
922If mode == P_NOWAIT return the pid of the process.
923If mode == P_WAIT return the process's exit code if it exits normally;
924otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000925 return spawnvp(mode, file, args)
926
927 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000928 """spawnlpe(mode, file, *args, env) -> integer
929
930Execute file (which is looked for along $PATH) with arguments from
931args in a subprocess with the supplied environment.
932If mode == P_NOWAIT return the pid of the process.
933If mode == P_WAIT return the process's exit code if it exits normally;
934otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000935 env = args[-1]
936 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000937
938
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000939 __all__.extend(["spawnvp", "spawnvpe", "spawnlp", "spawnlpe",])
Skip Montanaro269b83b2001-02-06 01:07:02 +0000940
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000941import copyreg as _copyreg
Michael W. Hudson0e025302002-03-06 17:11:18 +0000942
943def _make_stat_result(tup, dict):
944 return stat_result(tup, dict)
945
946def _pickle_stat_result(sr):
947 (type, args) = sr.__reduce__()
948 return (_make_stat_result, args)
949
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000950try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000951 _copyreg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000952except NameError: # stat_result may not exist
953 pass
Michael W. Hudson0e025302002-03-06 17:11:18 +0000954
955def _make_statvfs_result(tup, dict):
956 return statvfs_result(tup, dict)
957
958def _pickle_statvfs_result(sr):
959 (type, args) = sr.__reduce__()
960 return (_make_statvfs_result, args)
961
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000962try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000963 _copyreg.pickle(statvfs_result, _pickle_statvfs_result,
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000964 _make_statvfs_result)
Michael W. Hudsone5363b72002-03-15 10:21:59 +0000965except NameError: # statvfs_result may not exist
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000966 pass
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000967
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000968# Supply os.popen()
Antoine Pitrou877766d2011-03-19 17:00:37 +0100969def popen(cmd, mode="r", buffering=-1):
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000970 if not isinstance(cmd, str):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000971 raise TypeError("invalid cmd type (%s, expected string)" % type(cmd))
972 if mode not in ("r", "w"):
973 raise ValueError("invalid mode %r" % mode)
Antoine Pitrou877766d2011-03-19 17:00:37 +0100974 if buffering == 0 or buffering == None:
975 raise ValueError("popen() does not support unbuffered streams")
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000976 import subprocess, io
977 if mode == "r":
978 proc = subprocess.Popen(cmd,
979 shell=True,
980 stdout=subprocess.PIPE,
981 bufsize=buffering)
982 return _wrap_close(io.TextIOWrapper(proc.stdout), proc)
983 else:
984 proc = subprocess.Popen(cmd,
985 shell=True,
986 stdin=subprocess.PIPE,
987 bufsize=buffering)
988 return _wrap_close(io.TextIOWrapper(proc.stdin), proc)
989
990# Helper for popen() -- a proxy for a file whose close waits for the process
991class _wrap_close:
992 def __init__(self, stream, proc):
993 self._stream = stream
994 self._proc = proc
995 def close(self):
996 self._stream.close()
Amaury Forgeot d'Arc97e5f282009-07-11 09:35:13 +0000997 returncode = self._proc.wait()
998 if returncode == 0:
999 return None
1000 if name == 'nt':
1001 return returncode
1002 else:
1003 return returncode << 8 # Shift left to match old behavior
Antoine Pitrouac625352009-12-09 00:01:27 +00001004 def __enter__(self):
1005 return self
1006 def __exit__(self, *args):
1007 self.close()
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001008 def __getattr__(self, name):
1009 return getattr(self._stream, name)
Thomas Heller476157b2007-09-04 11:27:47 +00001010 def __iter__(self):
1011 return iter(self._stream)
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001012
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +00001013# Supply os.fdopen()
1014def fdopen(fd, *args, **kwargs):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +00001015 if not isinstance(fd, int):
1016 raise TypeError("invalid fd type (%s, expected integer)" % type(fd))
1017 import io
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +00001018 return io.open(fd, *args, **kwargs)