blob: 3bb0f4e2503199372842a2e969c4e7777072d68b [file] [log] [blame]
Ned Deily5c867012014-06-26 23:40:06 -07001r"""OS routines for NT or Posix depending on what system we're on.
Guido van Rossum31104f41992-01-14 18:28:36 +00002
Guido van Rossum54f22ed2000-02-04 15:10:34 +00003This exports:
Jesus Cea4791a242012-10-05 03:15:39 +02004 - all functions from posix, nt or ce, e.g. unlink, stat, etc.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +00005 - os.path is either posixpath or ntpath
Jesus Cea4791a242012-10-05 03:15:39 +02006 - os.name is either 'posix', 'nt' or 'ce'.
Guido van Rossum54f22ed2000-02-04 15:10:34 +00007 - os.curdir is a string representing the current directory ('.' or ':')
8 - os.pardir is a string representing the parent directory ('..' or '::')
9 - os.sep is the (or a most common) pathname separator ('/' or ':' or '\\')
Georg Brandled5b9b32008-12-05 07:45:54 +000010 - os.extsep is the extension separator (always '.')
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +000011 - os.altsep is the alternate pathname separator (None or '/')
Guido van Rossum54f22ed2000-02-04 15:10:34 +000012 - os.pathsep is the component separator used in $PATH etc
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +000013 - os.linesep is the line separator in text files ('\r' or '\n' or '\r\n')
Guido van Rossum54f22ed2000-02-04 15:10:34 +000014 - os.defpath is the default search path for executables
Martin v. Löwisbdec50f2004-06-08 08:29:33 +000015 - os.devnull is the file path of the null device ('/dev/null', etc.)
Guido van Rossum31104f41992-01-14 18:28:36 +000016
Guido van Rossum54f22ed2000-02-04 15:10:34 +000017Programs that import and use 'os' stand a better chance of being
18portable between different platforms. Of course, they must then
19only use functions that are defined by all platforms (e.g., unlink
20and opendir), and leave all pathname manipulation to os.path
21(e.g., split and join).
22"""
Guido van Rossum31104f41992-01-14 18:28:36 +000023
Skip Montanaro269b83b2001-02-06 01:07:02 +000024#'
25
Christian Heimes45f9af32007-11-27 21:50:00 +000026import sys, errno
Charles-François Natali7372b062012-02-05 15:15:38 +010027import stat as st
Guido van Rossuma28dab51997-08-29 22:36:47 +000028
29_names = sys.builtin_module_names
30
Tim Petersc4e09402003-04-25 07:11:48 +000031# Note: more names are added to __all__ later.
Brett Cannon13962fc2008-08-18 01:45:29 +000032__all__ = ["altsep", "curdir", "pardir", "sep", "pathsep", "linesep",
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030033 "defpath", "name", "path", "devnull", "SEEK_SET", "SEEK_CUR",
34 "SEEK_END", "fsencode", "fsdecode", "get_exec_path", "fdopen",
35 "popen", "extsep"]
Skip Montanaro269b83b2001-02-06 01:07:02 +000036
Charles-François Natali7372b062012-02-05 15:15:38 +010037def _exists(name):
38 return name in globals()
39
Skip Montanaro269b83b2001-02-06 01:07:02 +000040def _get_exports_list(module):
41 try:
42 return list(module.__all__)
43 except AttributeError:
44 return [n for n in dir(module) if n[0] != '_']
45
Brett Cannonfd074152012-04-14 14:10:13 -040046# Any new dependencies of the os module and/or changes in path separator
47# requires updating importlib as well.
Guido van Rossuma28dab51997-08-29 22:36:47 +000048if 'posix' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000049 name = 'posix'
Guido van Rossume9387ea1998-05-22 15:26:04 +000050 linesep = '\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000051 from posix import *
52 try:
53 from posix import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030054 __all__.append('_exit')
Brett Cannoncd171c82013-07-04 17:43:24 -040055 except ImportError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000056 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
Brett Cannoncd171c82013-07-04 17:43:24 -040061 except ImportError:
Larry Hastings9cf065c2012-06-22 16:30:09 -070062 pass
Skip Montanaro269b83b2001-02-06 01:07:02 +000063
Yury Selivanov97e2e062014-09-26 12:33:06 -040064 import posix
65 __all__.extend(_get_exports_list(posix))
66 del posix
67
Guido van Rossuma28dab51997-08-29 22:36:47 +000068elif 'nt' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000069 name = 'nt'
Guido van Rossume9387ea1998-05-22 15:26:04 +000070 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000071 from nt import *
Tim Peters6757c1e2003-01-08 21:20:57 +000072 try:
73 from nt import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030074 __all__.append('_exit')
Brett Cannoncd171c82013-07-04 17:43:24 -040075 except ImportError:
Tim Peters6757c1e2003-01-08 21:20:57 +000076 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000077 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000078
Skip Montanaro269b83b2001-02-06 01:07:02 +000079 import nt
80 __all__.extend(_get_exports_list(nt))
81 del nt
82
Larry Hastings9cf065c2012-06-22 16:30:09 -070083 try:
84 from nt import _have_functions
Brett Cannoncd171c82013-07-04 17:43:24 -040085 except ImportError:
Larry Hastings9cf065c2012-06-22 16:30:09 -070086 pass
87
Guido van Rossum18df5d41999-06-11 01:37:27 +000088elif 'ce' in _names:
89 name = 'ce'
90 linesep = '\r\n'
Guido van Rossum18df5d41999-06-11 01:37:27 +000091 from ce import *
Tim Peters6757c1e2003-01-08 21:20:57 +000092 try:
93 from ce import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030094 __all__.append('_exit')
Brett Cannoncd171c82013-07-04 17:43:24 -040095 except ImportError:
Tim Peters6757c1e2003-01-08 21:20:57 +000096 pass
Guido van Rossum18df5d41999-06-11 01:37:27 +000097 # We can use the standard Windows path.
Skip Montanaro117910d2003-02-14 19:35:31 +000098 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000099
Skip Montanaro269b83b2001-02-06 01:07:02 +0000100 import ce
101 __all__.extend(_get_exports_list(ce))
102 del ce
103
Larry Hastings9cf065c2012-06-22 16:30:09 -0700104 try:
105 from ce import _have_functions
Brett Cannoncd171c82013-07-04 17:43:24 -0400106 except ImportError:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700107 pass
108
Guido van Rossum2979b011994-08-01 11:18:30 +0000109else:
Brett Cannoncd171c82013-07-04 17:43:24 -0400110 raise ImportError('no os specific module found')
Guido van Rossume65cce51993-11-08 15:05:21 +0000111
Skip Montanaro117910d2003-02-14 19:35:31 +0000112sys.modules['os.path'] = path
Georg Brandled5b9b32008-12-05 07:45:54 +0000113from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep,
114 devnull)
Skip Montanaro269b83b2001-02-06 01:07:02 +0000115
Guido van Rossuma28dab51997-08-29 22:36:47 +0000116del _names
117
Larry Hastings9cf065c2012-06-22 16:30:09 -0700118
119if _exists("_have_functions"):
120 _globals = globals()
121 def _add(str, fn):
122 if (fn in _globals) and (str in _have_functions):
123 _set.add(_globals[fn])
124
125 _set = set()
126 _add("HAVE_FACCESSAT", "access")
127 _add("HAVE_FCHMODAT", "chmod")
128 _add("HAVE_FCHOWNAT", "chown")
129 _add("HAVE_FSTATAT", "stat")
130 _add("HAVE_FUTIMESAT", "utime")
131 _add("HAVE_LINKAT", "link")
132 _add("HAVE_MKDIRAT", "mkdir")
133 _add("HAVE_MKFIFOAT", "mkfifo")
134 _add("HAVE_MKNODAT", "mknod")
135 _add("HAVE_OPENAT", "open")
136 _add("HAVE_READLINKAT", "readlink")
137 _add("HAVE_RENAMEAT", "rename")
138 _add("HAVE_SYMLINKAT", "symlink")
139 _add("HAVE_UNLINKAT", "unlink")
Larry Hastingsb698d8e2012-06-23 16:55:07 -0700140 _add("HAVE_UNLINKAT", "rmdir")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700141 _add("HAVE_UTIMENSAT", "utime")
142 supports_dir_fd = _set
143
144 _set = set()
145 _add("HAVE_FACCESSAT", "access")
146 supports_effective_ids = _set
147
148 _set = set()
149 _add("HAVE_FCHDIR", "chdir")
150 _add("HAVE_FCHMOD", "chmod")
151 _add("HAVE_FCHOWN", "chown")
152 _add("HAVE_FDOPENDIR", "listdir")
153 _add("HAVE_FEXECVE", "execve")
154 _set.add(stat) # fstat always works
Georg Brandl306336b2012-06-24 12:55:33 +0200155 _add("HAVE_FTRUNCATE", "truncate")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700156 _add("HAVE_FUTIMENS", "utime")
157 _add("HAVE_FUTIMES", "utime")
Georg Brandl306336b2012-06-24 12:55:33 +0200158 _add("HAVE_FPATHCONF", "pathconf")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700159 if _exists("statvfs") and _exists("fstatvfs"): # mac os x10.3
160 _add("HAVE_FSTATVFS", "statvfs")
161 supports_fd = _set
162
163 _set = set()
164 _add("HAVE_FACCESSAT", "access")
Larry Hastingsdbbc0c82012-06-22 19:50:21 -0700165 # Some platforms don't support lchmod(). Often the function exists
166 # anyway, as a stub that always returns ENOSUP or perhaps EOPNOTSUPP.
167 # (No, I don't know why that's a good design.) ./configure will detect
168 # this and reject it--so HAVE_LCHMOD still won't be defined on such
169 # platforms. This is Very Helpful.
170 #
171 # However, sometimes platforms without a working lchmod() *do* have
172 # fchmodat(). (Examples: Linux kernel 3.2 with glibc 2.15,
173 # OpenIndiana 3.x.) And fchmodat() has a flag that theoretically makes
174 # it behave like lchmod(). So in theory it would be a suitable
175 # replacement for lchmod(). But when lchmod() doesn't work, fchmodat()'s
176 # flag doesn't work *either*. Sadly ./configure isn't sophisticated
177 # enough to detect this condition--it only determines whether or not
178 # fchmodat() minimally works.
179 #
180 # Therefore we simply ignore fchmodat() when deciding whether or not
181 # os.chmod supports follow_symlinks. Just checking lchmod() is
182 # sufficient. After all--if you have a working fchmodat(), your
183 # lchmod() almost certainly works too.
184 #
185 # _add("HAVE_FCHMODAT", "chmod")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700186 _add("HAVE_FCHOWNAT", "chown")
187 _add("HAVE_FSTATAT", "stat")
188 _add("HAVE_LCHFLAGS", "chflags")
189 _add("HAVE_LCHMOD", "chmod")
190 if _exists("lchown"): # mac os x10.3
191 _add("HAVE_LCHOWN", "chown")
192 _add("HAVE_LINKAT", "link")
193 _add("HAVE_LUTIMES", "utime")
194 _add("HAVE_LSTAT", "stat")
195 _add("HAVE_FSTATAT", "stat")
196 _add("HAVE_UTIMENSAT", "utime")
197 _add("MS_WINDOWS", "stat")
198 supports_follow_symlinks = _set
199
Larry Hastings9cf065c2012-06-22 16:30:09 -0700200 del _set
201 del _have_functions
202 del _globals
203 del _add
204
205
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000206# Python uses fixed values for the SEEK_ constants; they are mapped
207# to native constants if necessary in posixmodule.c
Jesus Cea94363612012-06-22 18:32:07 +0200208# Other possible SEEK values are directly imported from posixmodule.c
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000209SEEK_SET = 0
210SEEK_CUR = 1
211SEEK_END = 2
212
Guido van Rossum4def7de1998-07-24 20:48:03 +0000213# Super directory utilities.
214# (Inspired by Eric Raymond; the doc strings are mostly his)
215
Terry Reedy5a22b652010-12-02 07:05:56 +0000216def makedirs(name, mode=0o777, exist_ok=False):
Zachary Warea22ae212014-03-20 09:42:01 -0500217 """makedirs(name [, mode=0o777][, exist_ok=False])
Guido van Rossum4def7de1998-07-24 20:48:03 +0000218
Benjamin Petersonee5f1c12014-04-01 19:13:18 -0400219 Super-mkdir; create a leaf directory and all intermediate ones. Works like
220 mkdir, except that any intermediate path segment (not just the rightmost)
221 will be created if it does not exist. If the target directory already
222 exists, raise an OSError if exist_ok is False. Otherwise no exception is
Terry Reedy5a22b652010-12-02 07:05:56 +0000223 raised. This is recursive.
Guido van Rossum4def7de1998-07-24 20:48:03 +0000224
225 """
226 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000227 if not tail:
228 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000229 if head and tail and not path.exists(head):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000230 try:
Terry Reedy5a22b652010-12-02 07:05:56 +0000231 makedirs(head, mode, exist_ok)
Giampaolo Rodola'0166a282013-02-12 15:14:17 +0100232 except FileExistsError:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000233 # be happy if someone already created the path
Giampaolo Rodola'0166a282013-02-12 15:14:17 +0100234 pass
Serhiy Storchaka4ab23bf2013-01-08 11:32:58 +0200235 cdir = curdir
236 if isinstance(tail, bytes):
237 cdir = bytes(curdir, 'ASCII')
238 if tail == cdir: # xxx/newdir/. exists if xxx/newdir exists
Andrew M. Kuchling6fccc8a2003-12-23 16:33:28 +0000239 return
Terry Reedy5a22b652010-12-02 07:05:56 +0000240 try:
241 mkdir(name, mode)
242 except OSError as e:
Benjamin Petersonee5f1c12014-04-01 19:13:18 -0400243 if not exist_ok or e.errno != errno.EEXIST or not path.isdir(name):
Terry Reedy5a22b652010-12-02 07:05:56 +0000244 raise
Guido van Rossum4def7de1998-07-24 20:48:03 +0000245
246def removedirs(name):
Zachary Warea22ae212014-03-20 09:42:01 -0500247 """removedirs(name)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000248
Fredrik Lundh96c1c7a2005-11-12 15:55:04 +0000249 Super-rmdir; remove a leaf directory and all empty intermediate
Guido van Rossum4def7de1998-07-24 20:48:03 +0000250 ones. Works like rmdir except that, if the leaf directory is
251 successfully removed, directories corresponding to rightmost path
Tim Petersc4e09402003-04-25 07:11:48 +0000252 segments will be pruned away until either the whole path is
Guido van Rossum4def7de1998-07-24 20:48:03 +0000253 consumed or an error occurs. Errors during this latter phase are
254 ignored -- they generally mean that a directory was not empty.
255
256 """
257 rmdir(name)
258 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000259 if not tail:
260 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000261 while head and tail:
262 try:
263 rmdir(head)
Andrew Svetlov2552bc02012-12-24 21:47:24 +0200264 except OSError:
Guido van Rossum4def7de1998-07-24 20:48:03 +0000265 break
266 head, tail = path.split(head)
267
268def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000269 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000270
271 Super-rename; create directories as necessary and delete any left
272 empty. Works like rename, except creation of any intermediate
273 directories needed to make the new pathname good is attempted
274 first. After the rename, directories corresponding to rightmost
275 path segments of the old name will be pruned way until either the
276 whole path is consumed or a nonempty directory is found.
277
278 Note: this function can fail with the new directory structure made
279 if you lack permissions needed to unlink the leaf directory or
280 file.
281
282 """
283 head, tail = path.split(new)
284 if head and tail and not path.exists(head):
285 makedirs(head)
286 rename(old, new)
287 head, tail = path.split(old)
288 if head and tail:
289 try:
290 removedirs(head)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200291 except OSError:
Guido van Rossum4def7de1998-07-24 20:48:03 +0000292 pass
293
Skip Montanaro269b83b2001-02-06 01:07:02 +0000294__all__.extend(["makedirs", "removedirs", "renames"])
295
Guido van Rossumd8faa362007-04-27 19:54:29 +0000296def walk(top, topdown=True, onerror=None, followlinks=False):
Tim Petersc4e09402003-04-25 07:11:48 +0000297 """Directory tree generator.
298
299 For each directory in the directory tree rooted at top (including top
300 itself, but excluding '.' and '..'), yields a 3-tuple
301
302 dirpath, dirnames, filenames
303
304 dirpath is a string, the path to the directory. dirnames is a list of
305 the names of the subdirectories in dirpath (excluding '.' and '..').
306 filenames is a list of the names of the non-directory files in dirpath.
307 Note that the names in the lists are just names, with no path components.
308 To get a full path (which begins with top) to a file or directory in
309 dirpath, do os.path.join(dirpath, name).
310
311 If optional arg 'topdown' is true or not specified, the triple for a
312 directory is generated before the triples for any of its subdirectories
313 (directories are generated top down). If topdown is false, the triple
314 for a directory is generated after the triples for all of its
315 subdirectories (directories are generated bottom up).
316
317 When topdown is true, the caller can modify the dirnames list in-place
318 (e.g., via del or slice assignment), and walk will only recurse into the
Benjamin Petersone58e0c72014-06-15 20:51:12 -0700319 subdirectories whose names remain in dirnames; this can be used to prune the
320 search, or to impose a specific order of visiting. Modifying dirnames when
321 topdown is false is ineffective, since the directories in dirnames have
322 already been generated by the time dirnames itself is generated. No matter
323 the value of topdown, the list of subdirectories is retrieved before the
324 tuples for the directory and its subdirectories are generated.
Tim Petersc4e09402003-04-25 07:11:48 +0000325
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000326 By default errors from the os.listdir() call are ignored. If
327 optional arg 'onerror' is specified, it should be a function; it
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200328 will be called with one argument, an OSError instance. It can
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000329 report the error to continue with the walk, or raise the exception
330 to abort the walk. Note that the filename is available as the
331 filename attribute of the exception object.
332
Guido van Rossumd8faa362007-04-27 19:54:29 +0000333 By default, os.walk does not follow symbolic links to subdirectories on
334 systems that support them. In order to get this functionality, set the
335 optional argument 'followlinks' to true.
336
Tim Petersc4e09402003-04-25 07:11:48 +0000337 Caution: if you pass a relative pathname for top, don't change the
338 current working directory between resumptions of walk. walk never
339 changes the current directory, and assumes that the client doesn't
340 either.
341
342 Example:
343
Christian Heimes5d8da202008-05-06 13:58:24 +0000344 import os
Tim Petersc4e09402003-04-25 07:11:48 +0000345 from os.path import join, getsize
Christian Heimes5d8da202008-05-06 13:58:24 +0000346 for root, dirs, files in os.walk('python/Lib/email'):
Neal Norwitz752abd02008-05-13 04:55:24 +0000347 print(root, "consumes", end="")
348 print(sum([getsize(join(root, name)) for name in files]), end="")
349 print("bytes in", len(files), "non-directory files")
Tim Petersc4e09402003-04-25 07:11:48 +0000350 if 'CVS' in dirs:
351 dirs.remove('CVS') # don't visit CVS directories
Benjamin Petersone58e0c72014-06-15 20:51:12 -0700352
Tim Petersc4e09402003-04-25 07:11:48 +0000353 """
354
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000355 islink, join, isdir = path.islink, path.join, path.isdir
Tim Petersc4e09402003-04-25 07:11:48 +0000356
357 # We may not have read permission for top, in which case we can't
Alexandre Vassalotti4e6531e2008-05-09 20:00:17 +0000358 # get a list of the files the directory contains. os.walk
Tim Petersc4e09402003-04-25 07:11:48 +0000359 # always suppressed the exception then, rather than blow up for a
360 # minor reason when (say) a thousand readable directories are still
361 # left to visit. That logic is copied here.
362 try:
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200363 # Note that listdir is global in this module due
Tim Petersc4e09402003-04-25 07:11:48 +0000364 # to earlier import-*.
365 names = listdir(top)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200366 except OSError as err:
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000367 if onerror is not None:
368 onerror(err)
Tim Petersc4e09402003-04-25 07:11:48 +0000369 return
370
371 dirs, nondirs = [], []
372 for name in names:
373 if isdir(join(top, name)):
374 dirs.append(name)
375 else:
376 nondirs.append(name)
377
378 if topdown:
379 yield top, dirs, nondirs
380 for name in dirs:
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000381 new_path = join(top, name)
382 if followlinks or not islink(new_path):
Benjamin Peterson569d0872012-05-10 16:17:35 -0500383 yield from walk(new_path, topdown, onerror, followlinks)
Tim Petersc4e09402003-04-25 07:11:48 +0000384 if not topdown:
385 yield top, dirs, nondirs
386
387__all__.append("walk")
388
Larry Hastingsc48fe982012-06-25 04:49:05 -0700389if {open, stat} <= supports_dir_fd and {listdir, stat} <= supports_fd:
Charles-François Natali7372b062012-02-05 15:15:38 +0100390
Larry Hastingsb4038062012-07-15 10:57:38 -0700391 def fwalk(top=".", topdown=True, onerror=None, *, follow_symlinks=False, dir_fd=None):
Charles-François Natali7372b062012-02-05 15:15:38 +0100392 """Directory tree generator.
393
394 This behaves exactly like walk(), except that it yields a 4-tuple
395
396 dirpath, dirnames, filenames, dirfd
397
398 `dirpath`, `dirnames` and `filenames` are identical to walk() output,
399 and `dirfd` is a file descriptor referring to the directory `dirpath`.
400
Larry Hastingsc48fe982012-06-25 04:49:05 -0700401 The advantage of fwalk() over walk() is that it's safe against symlink
Larry Hastingsb4038062012-07-15 10:57:38 -0700402 races (when follow_symlinks is False).
Charles-François Natali7372b062012-02-05 15:15:38 +0100403
Larry Hastingsc48fe982012-06-25 04:49:05 -0700404 If dir_fd is not None, it should be a file descriptor open to a directory,
405 and top should be relative; top will then be relative to that directory.
406 (dir_fd is always supported for fwalk.)
407
Charles-François Natali7372b062012-02-05 15:15:38 +0100408 Caution:
409 Since fwalk() yields file descriptors, those are only valid until the
410 next iteration step, so you should dup() them if you want to keep them
411 for a longer period.
412
413 Example:
414
415 import os
416 for root, dirs, files, rootfd in os.fwalk('python/Lib/email'):
417 print(root, "consumes", end="")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700418 print(sum([os.stat(name, dir_fd=rootfd).st_size for name in files]),
Charles-François Natali7372b062012-02-05 15:15:38 +0100419 end="")
420 print("bytes in", len(files), "non-directory files")
421 if 'CVS' in dirs:
422 dirs.remove('CVS') # don't visit CVS directories
423 """
424 # Note: To guard against symlink races, we use the standard
425 # lstat()/open()/fstat() trick.
Larry Hastingsc48fe982012-06-25 04:49:05 -0700426 orig_st = stat(top, follow_symlinks=False, dir_fd=dir_fd)
427 topfd = open(top, O_RDONLY, dir_fd=dir_fd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100428 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700429 if (follow_symlinks or (st.S_ISDIR(orig_st.st_mode) and
430 path.samestat(orig_st, stat(topfd)))):
431 yield from _fwalk(topfd, top, topdown, onerror, follow_symlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100432 finally:
433 close(topfd)
434
Larry Hastingsb4038062012-07-15 10:57:38 -0700435 def _fwalk(topfd, toppath, topdown, onerror, follow_symlinks):
Charles-François Natali7372b062012-02-05 15:15:38 +0100436 # Note: This uses O(depth of the directory tree) file descriptors: if
437 # necessary, it can be adapted to only require O(1) FDs, see issue
438 # #13734.
439
Larry Hastings9cf065c2012-06-22 16:30:09 -0700440 names = listdir(topfd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100441 dirs, nondirs = [], []
442 for name in names:
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200443 try:
444 # Here, we don't use AT_SYMLINK_NOFOLLOW to be consistent with
445 # walk() which reports symlinks to directories as directories.
446 # We do however check for symlinks before recursing into
447 # a subdirectory.
Larry Hastings9cf065c2012-06-22 16:30:09 -0700448 if st.S_ISDIR(stat(name, dir_fd=topfd).st_mode):
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200449 dirs.append(name)
450 else:
451 nondirs.append(name)
452 except FileNotFoundError:
453 try:
454 # Add dangling symlinks, ignore disappeared files
Larry Hastings9cf065c2012-06-22 16:30:09 -0700455 if st.S_ISLNK(stat(name, dir_fd=topfd, follow_symlinks=False)
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200456 .st_mode):
457 nondirs.append(name)
458 except FileNotFoundError:
459 continue
Charles-François Natali7372b062012-02-05 15:15:38 +0100460
461 if topdown:
462 yield toppath, dirs, nondirs, topfd
463
464 for name in dirs:
465 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700466 orig_st = stat(name, dir_fd=topfd, follow_symlinks=follow_symlinks)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700467 dirfd = open(name, O_RDONLY, dir_fd=topfd)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200468 except OSError as err:
Charles-François Natali7372b062012-02-05 15:15:38 +0100469 if onerror is not None:
470 onerror(err)
471 return
472 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700473 if follow_symlinks or path.samestat(orig_st, stat(dirfd)):
Charles-François Natali7372b062012-02-05 15:15:38 +0100474 dirpath = path.join(toppath, name)
Larry Hastingsb4038062012-07-15 10:57:38 -0700475 yield from _fwalk(dirfd, dirpath, topdown, onerror, follow_symlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100476 finally:
477 close(dirfd)
478
479 if not topdown:
480 yield toppath, dirs, nondirs, topfd
481
482 __all__.append("fwalk")
483
Guido van Rossuma28dab51997-08-29 22:36:47 +0000484# Make sure os.environ exists, at least
485try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000486 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000487except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000488 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000489
Guido van Rossume65cce51993-11-08 15:05:21 +0000490def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000491 """execl(file, *args)
492
493 Execute the executable file with argument list args, replacing the
494 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000495 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000496
497def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000498 """execle(file, *args, env)
499
500 Execute the executable file with argument list args and
501 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000502 env = args[-1]
503 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000504
505def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000506 """execlp(file, *args)
507
508 Execute the executable file (which is searched for along $PATH)
509 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000510 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000511
Guido van Rossum030afb11995-03-14 17:27:18 +0000512def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000513 """execlpe(file, *args, env)
514
515 Execute the executable file (which is searched for along $PATH)
516 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000517 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000518 env = args[-1]
519 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000520
Guido van Rossume65cce51993-11-08 15:05:21 +0000521def execvp(file, args):
Matthias Klosea09c54f2010-01-31 16:48:44 +0000522 """execvp(file, args)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000523
524 Execute the executable file (which is searched for along $PATH)
525 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000526 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000527 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000528
529def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000530 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000531
532 Execute the executable file (which is searched for along $PATH)
533 with argument list args and environment env , replacing the
534 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000535 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000536 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000537
Skip Montanaro269b83b2001-02-06 01:07:02 +0000538__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
539
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000540def _execvpe(file, args, env=None):
541 if env is not None:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000542 exec_func = execve
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000543 argrest = (args, env)
544 else:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000545 exec_func = execv
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000546 argrest = (args,)
547 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000548
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000549 head, tail = path.split(file)
550 if head:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000551 exec_func(file, *argrest)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000552 return
Guido van Rossume7ba4952007-06-06 23:52:48 +0000553 last_exc = saved_exc = None
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000554 saved_tb = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000555 path_list = get_exec_path(env)
556 if name != 'nt':
557 file = fsencode(file)
558 path_list = map(fsencode, path_list)
559 for dir in path_list:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000560 fullname = path.join(dir, file)
561 try:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000562 exec_func(fullname, *argrest)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200563 except OSError as e:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000564 last_exc = e
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000565 tb = sys.exc_info()[2]
Christian Heimes45f9af32007-11-27 21:50:00 +0000566 if (e.errno != errno.ENOENT and e.errno != errno.ENOTDIR
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000567 and saved_exc is None):
568 saved_exc = e
569 saved_tb = tb
570 if saved_exc:
Benjamin Peterson4b068192009-02-20 03:19:25 +0000571 raise saved_exc.with_traceback(saved_tb)
572 raise last_exc.with_traceback(tb)
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000573
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000574
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000575def get_exec_path(env=None):
576 """Returns the sequence of directories that will be searched for the
577 named executable (similar to a shell) when launching a process.
578
579 *env* must be an environment variable dict or None. If *env* is None,
580 os.environ will be used.
581 """
Victor Stinner273b7662010-11-06 12:59:33 +0000582 # Use a local import instead of a global import to limit the number of
583 # modules loaded at startup: the os module is always loaded at startup by
584 # Python. It may also avoid a bootstrap issue.
Victor Stinner6f35eda2010-10-29 00:38:58 +0000585 import warnings
586
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000587 if env is None:
588 env = environ
Victor Stinnerb745a742010-05-18 17:17:23 +0000589
Victor Stinnerbb4f2182010-11-07 15:43:39 +0000590 # {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a
591 # BytesWarning when using python -b or python -bb: ignore the warning
Victor Stinner273b7662010-11-06 12:59:33 +0000592 with warnings.catch_warnings():
593 warnings.simplefilter("ignore", BytesWarning)
Victor Stinnerb745a742010-05-18 17:17:23 +0000594
Victor Stinnerb745a742010-05-18 17:17:23 +0000595 try:
Victor Stinner273b7662010-11-06 12:59:33 +0000596 path_list = env.get('PATH')
597 except TypeError:
598 path_list = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000599
Victor Stinner273b7662010-11-06 12:59:33 +0000600 if supports_bytes_environ:
601 try:
602 path_listb = env[b'PATH']
603 except (KeyError, TypeError):
604 pass
605 else:
606 if path_list is not None:
607 raise ValueError(
608 "env cannot contain 'PATH' and b'PATH' keys")
609 path_list = path_listb
610
611 if path_list is not None and isinstance(path_list, bytes):
612 path_list = fsdecode(path_list)
Victor Stinnerb745a742010-05-18 17:17:23 +0000613
614 if path_list is None:
615 path_list = defpath
616 return path_list.split(pathsep)
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000617
618
Skip Montanaro289bc052007-08-17 02:30:27 +0000619# Change environ to automatically call putenv(), unsetenv if they exist.
Christian Heimesf1dc3ee2013-10-13 02:04:20 +0200620from _collections_abc import MutableMapping
Skip Montanaro289bc052007-08-17 02:30:27 +0000621
622class _Environ(MutableMapping):
Victor Stinner84ae1182010-05-06 22:05:07 +0000623 def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv):
624 self.encodekey = encodekey
625 self.decodekey = decodekey
626 self.encodevalue = encodevalue
627 self.decodevalue = decodevalue
Skip Montanaro289bc052007-08-17 02:30:27 +0000628 self.putenv = putenv
629 self.unsetenv = unsetenv
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000630 self._data = data
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000631
Skip Montanaro289bc052007-08-17 02:30:27 +0000632 def __getitem__(self, key):
Victor Stinner6d101392013-04-14 16:35:04 +0200633 try:
634 value = self._data[self.encodekey(key)]
635 except KeyError:
636 # raise KeyError with the original key value
Victor Stinner0c2dd0c2013-08-23 19:19:15 +0200637 raise KeyError(key) from None
Victor Stinner84ae1182010-05-06 22:05:07 +0000638 return self.decodevalue(value)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000639
Skip Montanaro289bc052007-08-17 02:30:27 +0000640 def __setitem__(self, key, value):
Victor Stinner84ae1182010-05-06 22:05:07 +0000641 key = self.encodekey(key)
642 value = self.encodevalue(value)
Skip Montanaro289bc052007-08-17 02:30:27 +0000643 self.putenv(key, value)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000644 self._data[key] = value
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000645
Skip Montanaro289bc052007-08-17 02:30:27 +0000646 def __delitem__(self, key):
Victor Stinner6d101392013-04-14 16:35:04 +0200647 encodedkey = self.encodekey(key)
648 self.unsetenv(encodedkey)
649 try:
650 del self._data[encodedkey]
651 except KeyError:
652 # raise KeyError with the original key value
Victor Stinner0c2dd0c2013-08-23 19:19:15 +0200653 raise KeyError(key) from None
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000654
Skip Montanaro289bc052007-08-17 02:30:27 +0000655 def __iter__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000656 for key in self._data:
Victor Stinner84ae1182010-05-06 22:05:07 +0000657 yield self.decodekey(key)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000658
Skip Montanaro289bc052007-08-17 02:30:27 +0000659 def __len__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000660 return len(self._data)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000661
662 def __repr__(self):
Victor Stinnerbed71172010-07-28 21:25:42 +0000663 return 'environ({{{}}})'.format(', '.join(
Victor Stinnerd73c1a32010-07-28 21:23:23 +0000664 ('{!r}: {!r}'.format(self.decodekey(key), self.decodevalue(value))
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000665 for key, value in self._data.items())))
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000666
Skip Montanaro289bc052007-08-17 02:30:27 +0000667 def copy(self):
668 return dict(self)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000669
Skip Montanaro289bc052007-08-17 02:30:27 +0000670 def setdefault(self, key, value):
671 if key not in self:
672 self[key] = value
673 return self[key]
674
675try:
676 _putenv = putenv
677except NameError:
678 _putenv = lambda key, value: None
Richard Oudkerkc41917f2013-05-07 14:36:51 +0100679else:
680 if "putenv" not in __all__:
681 __all__.append("putenv")
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000682
Skip Montanaro289bc052007-08-17 02:30:27 +0000683try:
684 _unsetenv = unsetenv
685except NameError:
686 _unsetenv = lambda key: _putenv(key, "")
Richard Oudkerkc41917f2013-05-07 14:36:51 +0100687else:
688 if "unsetenv" not in __all__:
689 __all__.append("unsetenv")
Guido van Rossumc524d952001-10-19 01:31:59 +0000690
Victor Stinner84ae1182010-05-06 22:05:07 +0000691def _createenviron():
Jesus Cea4791a242012-10-05 03:15:39 +0200692 if name == 'nt':
Victor Stinner84ae1182010-05-06 22:05:07 +0000693 # Where Env Var Names Must Be UPPERCASE
694 def check_str(value):
695 if not isinstance(value, str):
696 raise TypeError("str expected, not %s" % type(value).__name__)
697 return value
698 encode = check_str
699 decode = str
700 def encodekey(key):
701 return encode(key).upper()
702 data = {}
703 for key, value in environ.items():
704 data[encodekey(key)] = value
705 else:
706 # Where Env Var Names Can Be Mixed Case
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000707 encoding = sys.getfilesystemencoding()
Victor Stinner84ae1182010-05-06 22:05:07 +0000708 def encode(value):
709 if not isinstance(value, str):
710 raise TypeError("str expected, not %s" % type(value).__name__)
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000711 return value.encode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000712 def decode(value):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000713 return value.decode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000714 encodekey = encode
715 data = environ
716 return _Environ(data,
717 encodekey, decode,
718 encode, decode,
719 _putenv, _unsetenv)
Guido van Rossumc524d952001-10-19 01:31:59 +0000720
Victor Stinner84ae1182010-05-06 22:05:07 +0000721# unicode environ
722environ = _createenviron()
723del _createenviron
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000724
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000725
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000726def getenv(key, default=None):
Tim Peters2c60f7a2003-01-29 03:49:43 +0000727 """Get an environment variable, return None if it doesn't exist.
Victor Stinner84ae1182010-05-06 22:05:07 +0000728 The optional second argument can specify an alternate default.
729 key, default and the result are str."""
Tim Peters2c60f7a2003-01-29 03:49:43 +0000730 return environ.get(key, default)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000731
Jesus Cea4791a242012-10-05 03:15:39 +0200732supports_bytes_environ = (name != 'nt')
Victor Stinnerb745a742010-05-18 17:17:23 +0000733__all__.extend(("getenv", "supports_bytes_environ"))
734
735if supports_bytes_environ:
Victor Stinner84ae1182010-05-06 22:05:07 +0000736 def _check_bytes(value):
737 if not isinstance(value, bytes):
738 raise TypeError("bytes expected, not %s" % type(value).__name__)
739 return value
740
741 # bytes environ
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000742 environb = _Environ(environ._data,
Victor Stinner84ae1182010-05-06 22:05:07 +0000743 _check_bytes, bytes,
744 _check_bytes, bytes,
745 _putenv, _unsetenv)
746 del _check_bytes
747
748 def getenvb(key, default=None):
749 """Get an environment variable, return None if it doesn't exist.
750 The optional second argument can specify an alternate default.
751 key, default and the result are bytes."""
752 return environb.get(key, default)
Victor Stinner70120e22010-07-29 17:19:38 +0000753
754 __all__.extend(("environb", "getenvb"))
Victor Stinner84ae1182010-05-06 22:05:07 +0000755
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000756def _fscodec():
757 encoding = sys.getfilesystemencoding()
758 if encoding == 'mbcs':
Victor Stinnere882aac2010-10-24 21:12:26 +0000759 errors = 'strict'
Victor Stinner313a1202010-06-11 23:56:51 +0000760 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000761 errors = 'surrogateescape'
Victor Stinnere8d51452010-08-19 01:05:19 +0000762
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000763 def fsencode(filename):
764 """
765 Encode filename to the filesystem encoding with 'surrogateescape' error
766 handler, return bytes unchanged. On Windows, use 'strict' error handler if
767 the file system encoding is 'mbcs' (which is the default encoding).
768 """
769 if isinstance(filename, bytes):
770 return filename
771 elif isinstance(filename, str):
772 return filename.encode(encoding, errors)
Victor Stinnere8d51452010-08-19 01:05:19 +0000773 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000774 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
775
776 def fsdecode(filename):
777 """
778 Decode filename from the filesystem encoding with 'surrogateescape' error
779 handler, return str unchanged. On Windows, use 'strict' error handler if
780 the file system encoding is 'mbcs' (which is the default encoding).
781 """
782 if isinstance(filename, str):
783 return filename
784 elif isinstance(filename, bytes):
785 return filename.decode(encoding, errors)
786 else:
787 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
788
789 return fsencode, fsdecode
790
791fsencode, fsdecode = _fscodec()
792del _fscodec
Victor Stinner449c4662010-05-08 11:10:09 +0000793
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000794# Supply spawn*() (probably only for Unix)
795if _exists("fork") and not _exists("spawnv") and _exists("execv"):
796
797 P_WAIT = 0
798 P_NOWAIT = P_NOWAITO = 1
799
Petri Lehtinen3bc37f22012-05-23 21:36:16 +0300800 __all__.extend(["P_WAIT", "P_NOWAIT", "P_NOWAITO"])
801
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000802 # XXX Should we support P_DETACH? I suppose it could fork()**2
803 # and close the std I/O streams. Also, P_OVERLAY is the same
804 # as execv*()?
805
806 def _spawnvef(mode, file, args, env, func):
807 # Internal helper; func is the exec*() function to use
808 pid = fork()
809 if not pid:
810 # Child
811 try:
812 if env is None:
813 func(file, args)
814 else:
815 func(file, args, env)
816 except:
817 _exit(127)
818 else:
819 # Parent
820 if mode == P_NOWAIT:
821 return pid # Caller is responsible for waiting!
822 while 1:
823 wpid, sts = waitpid(pid, 0)
824 if WIFSTOPPED(sts):
825 continue
826 elif WIFSIGNALED(sts):
827 return -WTERMSIG(sts)
828 elif WIFEXITED(sts):
829 return WEXITSTATUS(sts)
830 else:
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200831 raise OSError("Not stopped, signaled or exited???")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000832
833 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000834 """spawnv(mode, file, args) -> integer
835
836Execute file with arguments from args in a subprocess.
837If mode == P_NOWAIT return the pid of the process.
838If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000839otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000840 return _spawnvef(mode, file, args, None, execv)
841
842 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000843 """spawnve(mode, file, args, env) -> integer
844
845Execute file with arguments from args in a subprocess with the
846specified environment.
847If mode == P_NOWAIT return the pid of the process.
848If mode == P_WAIT return the process's exit code if it exits normally;
849otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000850 return _spawnvef(mode, file, args, env, execve)
851
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000852 # Note: spawnvp[e] is't currently supported on Windows
853
854 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000855 """spawnvp(mode, file, args) -> integer
856
857Execute file (which is looked for along $PATH) with arguments from
858args in a subprocess.
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 Rossumdd7cbbf1999-11-02 20:44:07 +0000862 return _spawnvef(mode, file, args, None, execvp)
863
864 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000865 """spawnvpe(mode, file, args, env) -> integer
866
867Execute file (which is looked for along $PATH) with arguments from
868args in a subprocess with the supplied environment.
869If mode == P_NOWAIT return the pid of the process.
870If mode == P_WAIT return the process's exit code if it exits normally;
871otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000872 return _spawnvef(mode, file, args, env, execvpe)
873
Richard Oudkerkad34ef82013-05-07 14:23:42 +0100874
875 __all__.extend(["spawnv", "spawnve", "spawnvp", "spawnvpe"])
876
877
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000878if _exists("spawnv"):
879 # These aren't supplied by the basic Windows code
880 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000881
882 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000883 """spawnl(mode, file, *args) -> integer
884
885Execute file with arguments from args in a subprocess.
886If mode == P_NOWAIT return the pid of the process.
887If mode == P_WAIT return the process's exit code if it exits normally;
888otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000889 return spawnv(mode, file, args)
890
891 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000892 """spawnle(mode, file, *args, env) -> integer
893
894Execute file with arguments from args in a subprocess with the
895supplied environment.
896If mode == P_NOWAIT return the pid of the process.
897If mode == P_WAIT return the process's exit code if it exits normally;
898otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000899 env = args[-1]
900 return spawnve(mode, file, args[:-1], env)
901
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000902
Richard Oudkerkad34ef82013-05-07 14:23:42 +0100903 __all__.extend(["spawnl", "spawnle"])
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000904
905
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000906if _exists("spawnvp"):
907 # At the moment, Windows doesn't implement spawnvp[e],
908 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000909 def spawnlp(mode, file, *args):
Neal Norwitzb7f68102003-07-02 02:49:33 +0000910 """spawnlp(mode, file, *args) -> integer
Guido van Rossume0cd2912000-04-21 18:35:36 +0000911
912Execute file (which is looked for along $PATH) with arguments from
913args in a subprocess with the supplied environment.
914If mode == P_NOWAIT return the pid of the process.
915If mode == P_WAIT return the process's exit code if it exits normally;
916otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000917 return spawnvp(mode, file, args)
918
919 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000920 """spawnlpe(mode, file, *args, env) -> integer
921
922Execute file (which is looked for along $PATH) with arguments from
923args in a subprocess with the supplied environment.
924If mode == P_NOWAIT return the pid of the process.
925If mode == P_WAIT return the process's exit code if it exits normally;
926otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000927 env = args[-1]
928 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000929
930
Richard Oudkerkad34ef82013-05-07 14:23:42 +0100931 __all__.extend(["spawnlp", "spawnlpe"])
932
Skip Montanaro269b83b2001-02-06 01:07:02 +0000933
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000934# Supply os.popen()
Antoine Pitrou877766d2011-03-19 17:00:37 +0100935def popen(cmd, mode="r", buffering=-1):
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000936 if not isinstance(cmd, str):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000937 raise TypeError("invalid cmd type (%s, expected string)" % type(cmd))
938 if mode not in ("r", "w"):
939 raise ValueError("invalid mode %r" % mode)
Benjamin Petersonb29614e2012-10-09 11:16:03 -0400940 if buffering == 0 or buffering is None:
Antoine Pitrou877766d2011-03-19 17:00:37 +0100941 raise ValueError("popen() does not support unbuffered streams")
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000942 import subprocess, io
943 if mode == "r":
944 proc = subprocess.Popen(cmd,
945 shell=True,
946 stdout=subprocess.PIPE,
947 bufsize=buffering)
948 return _wrap_close(io.TextIOWrapper(proc.stdout), proc)
949 else:
950 proc = subprocess.Popen(cmd,
951 shell=True,
952 stdin=subprocess.PIPE,
953 bufsize=buffering)
954 return _wrap_close(io.TextIOWrapper(proc.stdin), proc)
955
956# Helper for popen() -- a proxy for a file whose close waits for the process
957class _wrap_close:
958 def __init__(self, stream, proc):
959 self._stream = stream
960 self._proc = proc
961 def close(self):
962 self._stream.close()
Amaury Forgeot d'Arc97e5f282009-07-11 09:35:13 +0000963 returncode = self._proc.wait()
964 if returncode == 0:
965 return None
966 if name == 'nt':
967 return returncode
968 else:
969 return returncode << 8 # Shift left to match old behavior
Antoine Pitrouac625352009-12-09 00:01:27 +0000970 def __enter__(self):
971 return self
972 def __exit__(self, *args):
973 self.close()
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000974 def __getattr__(self, name):
975 return getattr(self._stream, name)
Thomas Heller476157b2007-09-04 11:27:47 +0000976 def __iter__(self):
977 return iter(self._stream)
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000978
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +0000979# Supply os.fdopen()
980def fdopen(fd, *args, **kwargs):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000981 if not isinstance(fd, int):
982 raise TypeError("invalid fd type (%s, expected integer)" % type(fd))
983 import io
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +0000984 return io.open(fd, *args, **kwargs)