blob: a8f6a0b8db93cf20c611c407a7c4de750a112032 [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
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')
Brett Cannoncd171c82013-07-04 17:43:24 -040071 except ImportError:
Tim Peters6757c1e2003-01-08 21:20:57 +000072 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
Brett Cannoncd171c82013-07-04 17:43:24 -040081 except ImportError:
Larry Hastings9cf065c2012-06-22 16:30:09 -070082 pass
83
Guido van Rossum18df5d41999-06-11 01:37:27 +000084elif 'ce' in _names:
85 name = 'ce'
86 linesep = '\r\n'
Guido van Rossum18df5d41999-06-11 01:37:27 +000087 from ce import *
Tim Peters6757c1e2003-01-08 21:20:57 +000088 try:
89 from ce import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030090 __all__.append('_exit')
Brett Cannoncd171c82013-07-04 17:43:24 -040091 except ImportError:
Tim Peters6757c1e2003-01-08 21:20:57 +000092 pass
Guido van Rossum18df5d41999-06-11 01:37:27 +000093 # We can use the standard Windows path.
Skip Montanaro117910d2003-02-14 19:35:31 +000094 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000095
Skip Montanaro269b83b2001-02-06 01:07:02 +000096 import ce
97 __all__.extend(_get_exports_list(ce))
98 del ce
99
Larry Hastings9cf065c2012-06-22 16:30:09 -0700100 try:
101 from ce import _have_functions
Brett Cannoncd171c82013-07-04 17:43:24 -0400102 except ImportError:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700103 pass
104
Guido van Rossum2979b011994-08-01 11:18:30 +0000105else:
Brett Cannoncd171c82013-07-04 17:43:24 -0400106 raise ImportError('no os specific module found')
Guido van Rossume65cce51993-11-08 15:05:21 +0000107
Skip Montanaro117910d2003-02-14 19:35:31 +0000108sys.modules['os.path'] = path
Georg Brandled5b9b32008-12-05 07:45:54 +0000109from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep,
110 devnull)
Skip Montanaro269b83b2001-02-06 01:07:02 +0000111
Guido van Rossuma28dab51997-08-29 22:36:47 +0000112del _names
113
Larry Hastings9cf065c2012-06-22 16:30:09 -0700114
115if _exists("_have_functions"):
116 _globals = globals()
117 def _add(str, fn):
118 if (fn in _globals) and (str in _have_functions):
119 _set.add(_globals[fn])
120
121 _set = set()
122 _add("HAVE_FACCESSAT", "access")
123 _add("HAVE_FCHMODAT", "chmod")
124 _add("HAVE_FCHOWNAT", "chown")
125 _add("HAVE_FSTATAT", "stat")
126 _add("HAVE_FUTIMESAT", "utime")
127 _add("HAVE_LINKAT", "link")
128 _add("HAVE_MKDIRAT", "mkdir")
129 _add("HAVE_MKFIFOAT", "mkfifo")
130 _add("HAVE_MKNODAT", "mknod")
131 _add("HAVE_OPENAT", "open")
132 _add("HAVE_READLINKAT", "readlink")
133 _add("HAVE_RENAMEAT", "rename")
134 _add("HAVE_SYMLINKAT", "symlink")
135 _add("HAVE_UNLINKAT", "unlink")
Larry Hastingsb698d8e2012-06-23 16:55:07 -0700136 _add("HAVE_UNLINKAT", "rmdir")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700137 _add("HAVE_UTIMENSAT", "utime")
138 supports_dir_fd = _set
139
140 _set = set()
141 _add("HAVE_FACCESSAT", "access")
142 supports_effective_ids = _set
143
144 _set = set()
145 _add("HAVE_FCHDIR", "chdir")
146 _add("HAVE_FCHMOD", "chmod")
147 _add("HAVE_FCHOWN", "chown")
148 _add("HAVE_FDOPENDIR", "listdir")
149 _add("HAVE_FEXECVE", "execve")
150 _set.add(stat) # fstat always works
Georg Brandl306336b2012-06-24 12:55:33 +0200151 _add("HAVE_FTRUNCATE", "truncate")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700152 _add("HAVE_FUTIMENS", "utime")
153 _add("HAVE_FUTIMES", "utime")
Georg Brandl306336b2012-06-24 12:55:33 +0200154 _add("HAVE_FPATHCONF", "pathconf")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700155 if _exists("statvfs") and _exists("fstatvfs"): # mac os x10.3
156 _add("HAVE_FSTATVFS", "statvfs")
157 supports_fd = _set
158
159 _set = set()
160 _add("HAVE_FACCESSAT", "access")
Larry Hastingsdbbc0c82012-06-22 19:50:21 -0700161 # Some platforms don't support lchmod(). Often the function exists
162 # anyway, as a stub that always returns ENOSUP or perhaps EOPNOTSUPP.
163 # (No, I don't know why that's a good design.) ./configure will detect
164 # this and reject it--so HAVE_LCHMOD still won't be defined on such
165 # platforms. This is Very Helpful.
166 #
167 # However, sometimes platforms without a working lchmod() *do* have
168 # fchmodat(). (Examples: Linux kernel 3.2 with glibc 2.15,
169 # OpenIndiana 3.x.) And fchmodat() has a flag that theoretically makes
170 # it behave like lchmod(). So in theory it would be a suitable
171 # replacement for lchmod(). But when lchmod() doesn't work, fchmodat()'s
172 # flag doesn't work *either*. Sadly ./configure isn't sophisticated
173 # enough to detect this condition--it only determines whether or not
174 # fchmodat() minimally works.
175 #
176 # Therefore we simply ignore fchmodat() when deciding whether or not
177 # os.chmod supports follow_symlinks. Just checking lchmod() is
178 # sufficient. After all--if you have a working fchmodat(), your
179 # lchmod() almost certainly works too.
180 #
181 # _add("HAVE_FCHMODAT", "chmod")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700182 _add("HAVE_FCHOWNAT", "chown")
183 _add("HAVE_FSTATAT", "stat")
184 _add("HAVE_LCHFLAGS", "chflags")
185 _add("HAVE_LCHMOD", "chmod")
186 if _exists("lchown"): # mac os x10.3
187 _add("HAVE_LCHOWN", "chown")
188 _add("HAVE_LINKAT", "link")
189 _add("HAVE_LUTIMES", "utime")
190 _add("HAVE_LSTAT", "stat")
191 _add("HAVE_FSTATAT", "stat")
192 _add("HAVE_UTIMENSAT", "utime")
193 _add("MS_WINDOWS", "stat")
194 supports_follow_symlinks = _set
195
Larry Hastings9cf065c2012-06-22 16:30:09 -0700196 del _set
197 del _have_functions
198 del _globals
199 del _add
200
201
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000202# Python uses fixed values for the SEEK_ constants; they are mapped
203# to native constants if necessary in posixmodule.c
Jesus Cea94363612012-06-22 18:32:07 +0200204# Other possible SEEK values are directly imported from posixmodule.c
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000205SEEK_SET = 0
206SEEK_CUR = 1
207SEEK_END = 2
208
Guido van Rossum4def7de1998-07-24 20:48:03 +0000209# Super directory utilities.
210# (Inspired by Eric Raymond; the doc strings are mostly his)
211
Terry Reedy5a22b652010-12-02 07:05:56 +0000212def makedirs(name, mode=0o777, exist_ok=False):
Zachary Warea22ae212014-03-20 09:42:01 -0500213 """makedirs(name [, mode=0o777][, exist_ok=False])
Guido van Rossum4def7de1998-07-24 20:48:03 +0000214
Benjamin Petersonee5f1c12014-04-01 19:13:18 -0400215 Super-mkdir; create a leaf directory and all intermediate ones. Works like
216 mkdir, except that any intermediate path segment (not just the rightmost)
217 will be created if it does not exist. If the target directory already
218 exists, raise an OSError if exist_ok is False. Otherwise no exception is
Terry Reedy5a22b652010-12-02 07:05:56 +0000219 raised. This is recursive.
Guido van Rossum4def7de1998-07-24 20:48:03 +0000220
221 """
222 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000223 if not tail:
224 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000225 if head and tail and not path.exists(head):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000226 try:
Terry Reedy5a22b652010-12-02 07:05:56 +0000227 makedirs(head, mode, exist_ok)
Giampaolo Rodola'0166a282013-02-12 15:14:17 +0100228 except FileExistsError:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000229 # be happy if someone already created the path
Giampaolo Rodola'0166a282013-02-12 15:14:17 +0100230 pass
Serhiy Storchaka4ab23bf2013-01-08 11:32:58 +0200231 cdir = curdir
232 if isinstance(tail, bytes):
233 cdir = bytes(curdir, 'ASCII')
234 if tail == cdir: # xxx/newdir/. exists if xxx/newdir exists
Andrew M. Kuchling6fccc8a2003-12-23 16:33:28 +0000235 return
Terry Reedy5a22b652010-12-02 07:05:56 +0000236 try:
237 mkdir(name, mode)
238 except OSError as e:
Benjamin Petersonee5f1c12014-04-01 19:13:18 -0400239 if not exist_ok or e.errno != errno.EEXIST or not path.isdir(name):
Terry Reedy5a22b652010-12-02 07:05:56 +0000240 raise
Guido van Rossum4def7de1998-07-24 20:48:03 +0000241
242def removedirs(name):
Zachary Warea22ae212014-03-20 09:42:01 -0500243 """removedirs(name)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000244
Fredrik Lundh96c1c7a2005-11-12 15:55:04 +0000245 Super-rmdir; remove a leaf directory and all empty intermediate
Guido van Rossum4def7de1998-07-24 20:48:03 +0000246 ones. Works like rmdir except that, if the leaf directory is
247 successfully removed, directories corresponding to rightmost path
Tim Petersc4e09402003-04-25 07:11:48 +0000248 segments will be pruned away until either the whole path is
Guido van Rossum4def7de1998-07-24 20:48:03 +0000249 consumed or an error occurs. Errors during this latter phase are
250 ignored -- they generally mean that a directory was not empty.
251
252 """
253 rmdir(name)
254 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000255 if not tail:
256 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000257 while head and tail:
258 try:
259 rmdir(head)
Andrew Svetlov2552bc02012-12-24 21:47:24 +0200260 except OSError:
Guido van Rossum4def7de1998-07-24 20:48:03 +0000261 break
262 head, tail = path.split(head)
263
264def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000265 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000266
267 Super-rename; create directories as necessary and delete any left
268 empty. Works like rename, except creation of any intermediate
269 directories needed to make the new pathname good is attempted
270 first. After the rename, directories corresponding to rightmost
Benjamin Peterson52a3b742015-04-13 20:24:10 -0400271 path segments of the old name will be pruned until either the
Guido van Rossum4def7de1998-07-24 20:48:03 +0000272 whole path is consumed or a nonempty directory is found.
273
274 Note: this function can fail with the new directory structure made
275 if you lack permissions needed to unlink the leaf directory or
276 file.
277
278 """
279 head, tail = path.split(new)
280 if head and tail and not path.exists(head):
281 makedirs(head)
282 rename(old, new)
283 head, tail = path.split(old)
284 if head and tail:
285 try:
286 removedirs(head)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200287 except OSError:
Guido van Rossum4def7de1998-07-24 20:48:03 +0000288 pass
289
Skip Montanaro269b83b2001-02-06 01:07:02 +0000290__all__.extend(["makedirs", "removedirs", "renames"])
291
Guido van Rossumd8faa362007-04-27 19:54:29 +0000292def walk(top, topdown=True, onerror=None, followlinks=False):
Tim Petersc4e09402003-04-25 07:11:48 +0000293 """Directory tree generator.
294
295 For each directory in the directory tree rooted at top (including top
296 itself, but excluding '.' and '..'), yields a 3-tuple
297
298 dirpath, dirnames, filenames
299
300 dirpath is a string, the path to the directory. dirnames is a list of
301 the names of the subdirectories in dirpath (excluding '.' and '..').
302 filenames is a list of the names of the non-directory files in dirpath.
303 Note that the names in the lists are just names, with no path components.
304 To get a full path (which begins with top) to a file or directory in
305 dirpath, do os.path.join(dirpath, name).
306
307 If optional arg 'topdown' is true or not specified, the triple for a
308 directory is generated before the triples for any of its subdirectories
309 (directories are generated top down). If topdown is false, the triple
310 for a directory is generated after the triples for all of its
311 subdirectories (directories are generated bottom up).
312
313 When topdown is true, the caller can modify the dirnames list in-place
314 (e.g., via del or slice assignment), and walk will only recurse into the
Benjamin Petersone58e0c72014-06-15 20:51:12 -0700315 subdirectories whose names remain in dirnames; this can be used to prune the
316 search, or to impose a specific order of visiting. Modifying dirnames when
317 topdown is false is ineffective, since the directories in dirnames have
318 already been generated by the time dirnames itself is generated. No matter
319 the value of topdown, the list of subdirectories is retrieved before the
320 tuples for the directory and its subdirectories are generated.
Tim Petersc4e09402003-04-25 07:11:48 +0000321
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000322 By default errors from the os.listdir() call are ignored. If
323 optional arg 'onerror' is specified, it should be a function; it
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200324 will be called with one argument, an OSError instance. It can
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000325 report the error to continue with the walk, or raise the exception
326 to abort the walk. Note that the filename is available as the
327 filename attribute of the exception object.
328
Guido van Rossumd8faa362007-04-27 19:54:29 +0000329 By default, os.walk does not follow symbolic links to subdirectories on
330 systems that support them. In order to get this functionality, set the
331 optional argument 'followlinks' to true.
332
Tim Petersc4e09402003-04-25 07:11:48 +0000333 Caution: if you pass a relative pathname for top, don't change the
334 current working directory between resumptions of walk. walk never
335 changes the current directory, and assumes that the client doesn't
336 either.
337
338 Example:
339
Christian Heimes5d8da202008-05-06 13:58:24 +0000340 import os
Tim Petersc4e09402003-04-25 07:11:48 +0000341 from os.path import join, getsize
Christian Heimes5d8da202008-05-06 13:58:24 +0000342 for root, dirs, files in os.walk('python/Lib/email'):
Neal Norwitz752abd02008-05-13 04:55:24 +0000343 print(root, "consumes", end="")
344 print(sum([getsize(join(root, name)) for name in files]), end="")
345 print("bytes in", len(files), "non-directory files")
Tim Petersc4e09402003-04-25 07:11:48 +0000346 if 'CVS' in dirs:
347 dirs.remove('CVS') # don't visit CVS directories
Benjamin Petersone58e0c72014-06-15 20:51:12 -0700348
Tim Petersc4e09402003-04-25 07:11:48 +0000349 """
350
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000351 islink, join, isdir = path.islink, path.join, path.isdir
Tim Petersc4e09402003-04-25 07:11:48 +0000352
353 # We may not have read permission for top, in which case we can't
Alexandre Vassalotti4e6531e2008-05-09 20:00:17 +0000354 # get a list of the files the directory contains. os.walk
Tim Petersc4e09402003-04-25 07:11:48 +0000355 # always suppressed the exception then, rather than blow up for a
356 # minor reason when (say) a thousand readable directories are still
357 # left to visit. That logic is copied here.
358 try:
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200359 # Note that listdir is global in this module due
Tim Petersc4e09402003-04-25 07:11:48 +0000360 # to earlier import-*.
361 names = listdir(top)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200362 except OSError as err:
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000363 if onerror is not None:
364 onerror(err)
Tim Petersc4e09402003-04-25 07:11:48 +0000365 return
366
367 dirs, nondirs = [], []
368 for name in names:
369 if isdir(join(top, name)):
370 dirs.append(name)
371 else:
372 nondirs.append(name)
373
374 if topdown:
375 yield top, dirs, nondirs
376 for name in dirs:
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000377 new_path = join(top, name)
378 if followlinks or not islink(new_path):
Benjamin Peterson569d0872012-05-10 16:17:35 -0500379 yield from walk(new_path, topdown, onerror, followlinks)
Tim Petersc4e09402003-04-25 07:11:48 +0000380 if not topdown:
381 yield top, dirs, nondirs
382
383__all__.append("walk")
384
Larry Hastingsc48fe982012-06-25 04:49:05 -0700385if {open, stat} <= supports_dir_fd and {listdir, stat} <= supports_fd:
Charles-François Natali7372b062012-02-05 15:15:38 +0100386
Larry Hastingsb4038062012-07-15 10:57:38 -0700387 def fwalk(top=".", topdown=True, onerror=None, *, follow_symlinks=False, dir_fd=None):
Charles-François Natali7372b062012-02-05 15:15:38 +0100388 """Directory tree generator.
389
390 This behaves exactly like walk(), except that it yields a 4-tuple
391
392 dirpath, dirnames, filenames, dirfd
393
394 `dirpath`, `dirnames` and `filenames` are identical to walk() output,
395 and `dirfd` is a file descriptor referring to the directory `dirpath`.
396
Larry Hastingsc48fe982012-06-25 04:49:05 -0700397 The advantage of fwalk() over walk() is that it's safe against symlink
Larry Hastingsb4038062012-07-15 10:57:38 -0700398 races (when follow_symlinks is False).
Charles-François Natali7372b062012-02-05 15:15:38 +0100399
Larry Hastingsc48fe982012-06-25 04:49:05 -0700400 If dir_fd is not None, it should be a file descriptor open to a directory,
401 and top should be relative; top will then be relative to that directory.
402 (dir_fd is always supported for fwalk.)
403
Charles-François Natali7372b062012-02-05 15:15:38 +0100404 Caution:
405 Since fwalk() yields file descriptors, those are only valid until the
406 next iteration step, so you should dup() them if you want to keep them
407 for a longer period.
408
409 Example:
410
411 import os
412 for root, dirs, files, rootfd in os.fwalk('python/Lib/email'):
413 print(root, "consumes", end="")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700414 print(sum([os.stat(name, dir_fd=rootfd).st_size for name in files]),
Charles-François Natali7372b062012-02-05 15:15:38 +0100415 end="")
416 print("bytes in", len(files), "non-directory files")
417 if 'CVS' in dirs:
418 dirs.remove('CVS') # don't visit CVS directories
419 """
420 # Note: To guard against symlink races, we use the standard
421 # lstat()/open()/fstat() trick.
Larry Hastingsc48fe982012-06-25 04:49:05 -0700422 orig_st = stat(top, follow_symlinks=False, dir_fd=dir_fd)
423 topfd = open(top, O_RDONLY, dir_fd=dir_fd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100424 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700425 if (follow_symlinks or (st.S_ISDIR(orig_st.st_mode) and
426 path.samestat(orig_st, stat(topfd)))):
427 yield from _fwalk(topfd, top, topdown, onerror, follow_symlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100428 finally:
429 close(topfd)
430
Larry Hastingsb4038062012-07-15 10:57:38 -0700431 def _fwalk(topfd, toppath, topdown, onerror, follow_symlinks):
Charles-François Natali7372b062012-02-05 15:15:38 +0100432 # Note: This uses O(depth of the directory tree) file descriptors: if
433 # necessary, it can be adapted to only require O(1) FDs, see issue
434 # #13734.
435
Larry Hastings9cf065c2012-06-22 16:30:09 -0700436 names = listdir(topfd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100437 dirs, nondirs = [], []
438 for name in names:
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200439 try:
440 # Here, we don't use AT_SYMLINK_NOFOLLOW to be consistent with
441 # walk() which reports symlinks to directories as directories.
442 # We do however check for symlinks before recursing into
443 # a subdirectory.
Larry Hastings9cf065c2012-06-22 16:30:09 -0700444 if st.S_ISDIR(stat(name, dir_fd=topfd).st_mode):
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200445 dirs.append(name)
446 else:
447 nondirs.append(name)
448 except FileNotFoundError:
449 try:
450 # Add dangling symlinks, ignore disappeared files
Larry Hastings9cf065c2012-06-22 16:30:09 -0700451 if st.S_ISLNK(stat(name, dir_fd=topfd, follow_symlinks=False)
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200452 .st_mode):
453 nondirs.append(name)
454 except FileNotFoundError:
455 continue
Charles-François Natali7372b062012-02-05 15:15:38 +0100456
457 if topdown:
458 yield toppath, dirs, nondirs, topfd
459
460 for name in dirs:
461 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700462 orig_st = stat(name, dir_fd=topfd, follow_symlinks=follow_symlinks)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700463 dirfd = open(name, O_RDONLY, dir_fd=topfd)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200464 except OSError as err:
Charles-François Natali7372b062012-02-05 15:15:38 +0100465 if onerror is not None:
466 onerror(err)
467 return
468 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700469 if follow_symlinks or path.samestat(orig_st, stat(dirfd)):
Charles-François Natali7372b062012-02-05 15:15:38 +0100470 dirpath = path.join(toppath, name)
Larry Hastingsb4038062012-07-15 10:57:38 -0700471 yield from _fwalk(dirfd, dirpath, topdown, onerror, follow_symlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100472 finally:
473 close(dirfd)
474
475 if not topdown:
476 yield toppath, dirs, nondirs, topfd
477
478 __all__.append("fwalk")
479
Guido van Rossuma28dab51997-08-29 22:36:47 +0000480# Make sure os.environ exists, at least
481try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000482 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000483except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000484 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000485
Guido van Rossume65cce51993-11-08 15:05:21 +0000486def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000487 """execl(file, *args)
488
489 Execute the executable file with argument list args, replacing the
490 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000491 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000492
493def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000494 """execle(file, *args, env)
495
496 Execute the executable file with argument list args and
497 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000498 env = args[-1]
499 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000500
501def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000502 """execlp(file, *args)
503
504 Execute the executable file (which is searched for along $PATH)
505 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000506 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000507
Guido van Rossum030afb11995-03-14 17:27:18 +0000508def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000509 """execlpe(file, *args, env)
510
511 Execute the executable file (which is searched for along $PATH)
512 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000513 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000514 env = args[-1]
515 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000516
Guido van Rossume65cce51993-11-08 15:05:21 +0000517def execvp(file, args):
Matthias Klosea09c54f2010-01-31 16:48:44 +0000518 """execvp(file, args)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000519
520 Execute the executable file (which is searched for along $PATH)
521 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000522 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000523 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000524
525def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000526 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000527
528 Execute the executable file (which is searched for along $PATH)
529 with argument list args and environment env , replacing the
530 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000531 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000532 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000533
Skip Montanaro269b83b2001-02-06 01:07:02 +0000534__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
535
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000536def _execvpe(file, args, env=None):
537 if env is not None:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000538 exec_func = execve
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000539 argrest = (args, env)
540 else:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000541 exec_func = execv
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000542 argrest = (args,)
543 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000544
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000545 head, tail = path.split(file)
546 if head:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000547 exec_func(file, *argrest)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000548 return
Guido van Rossume7ba4952007-06-06 23:52:48 +0000549 last_exc = saved_exc = None
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000550 saved_tb = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000551 path_list = get_exec_path(env)
552 if name != 'nt':
553 file = fsencode(file)
554 path_list = map(fsencode, path_list)
555 for dir in path_list:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000556 fullname = path.join(dir, file)
557 try:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000558 exec_func(fullname, *argrest)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200559 except OSError as e:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000560 last_exc = e
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000561 tb = sys.exc_info()[2]
Christian Heimes45f9af32007-11-27 21:50:00 +0000562 if (e.errno != errno.ENOENT and e.errno != errno.ENOTDIR
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000563 and saved_exc is None):
564 saved_exc = e
565 saved_tb = tb
566 if saved_exc:
Benjamin Peterson4b068192009-02-20 03:19:25 +0000567 raise saved_exc.with_traceback(saved_tb)
568 raise last_exc.with_traceback(tb)
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000569
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000570
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000571def get_exec_path(env=None):
572 """Returns the sequence of directories that will be searched for the
573 named executable (similar to a shell) when launching a process.
574
575 *env* must be an environment variable dict or None. If *env* is None,
576 os.environ will be used.
577 """
Victor Stinner273b7662010-11-06 12:59:33 +0000578 # Use a local import instead of a global import to limit the number of
579 # modules loaded at startup: the os module is always loaded at startup by
580 # Python. It may also avoid a bootstrap issue.
Victor Stinner6f35eda2010-10-29 00:38:58 +0000581 import warnings
582
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000583 if env is None:
584 env = environ
Victor Stinnerb745a742010-05-18 17:17:23 +0000585
Victor Stinnerbb4f2182010-11-07 15:43:39 +0000586 # {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a
587 # BytesWarning when using python -b or python -bb: ignore the warning
Victor Stinner273b7662010-11-06 12:59:33 +0000588 with warnings.catch_warnings():
589 warnings.simplefilter("ignore", BytesWarning)
Victor Stinnerb745a742010-05-18 17:17:23 +0000590
Victor Stinnerb745a742010-05-18 17:17:23 +0000591 try:
Victor Stinner273b7662010-11-06 12:59:33 +0000592 path_list = env.get('PATH')
593 except TypeError:
594 path_list = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000595
Victor Stinner273b7662010-11-06 12:59:33 +0000596 if supports_bytes_environ:
597 try:
598 path_listb = env[b'PATH']
599 except (KeyError, TypeError):
600 pass
601 else:
602 if path_list is not None:
603 raise ValueError(
604 "env cannot contain 'PATH' and b'PATH' keys")
605 path_list = path_listb
606
607 if path_list is not None and isinstance(path_list, bytes):
608 path_list = fsdecode(path_list)
Victor Stinnerb745a742010-05-18 17:17:23 +0000609
610 if path_list is None:
611 path_list = defpath
612 return path_list.split(pathsep)
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000613
614
Skip Montanaro289bc052007-08-17 02:30:27 +0000615# Change environ to automatically call putenv(), unsetenv if they exist.
Christian Heimesf1dc3ee2013-10-13 02:04:20 +0200616from _collections_abc import MutableMapping
Skip Montanaro289bc052007-08-17 02:30:27 +0000617
618class _Environ(MutableMapping):
Victor Stinner84ae1182010-05-06 22:05:07 +0000619 def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv):
620 self.encodekey = encodekey
621 self.decodekey = decodekey
622 self.encodevalue = encodevalue
623 self.decodevalue = decodevalue
Skip Montanaro289bc052007-08-17 02:30:27 +0000624 self.putenv = putenv
625 self.unsetenv = unsetenv
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000626 self._data = data
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000627
Skip Montanaro289bc052007-08-17 02:30:27 +0000628 def __getitem__(self, key):
Victor Stinner6d101392013-04-14 16:35:04 +0200629 try:
630 value = self._data[self.encodekey(key)]
631 except KeyError:
632 # raise KeyError with the original key value
Victor Stinner0c2dd0c2013-08-23 19:19:15 +0200633 raise KeyError(key) from None
Victor Stinner84ae1182010-05-06 22:05:07 +0000634 return self.decodevalue(value)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000635
Skip Montanaro289bc052007-08-17 02:30:27 +0000636 def __setitem__(self, key, value):
Victor Stinner84ae1182010-05-06 22:05:07 +0000637 key = self.encodekey(key)
638 value = self.encodevalue(value)
Skip Montanaro289bc052007-08-17 02:30:27 +0000639 self.putenv(key, value)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000640 self._data[key] = value
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000641
Skip Montanaro289bc052007-08-17 02:30:27 +0000642 def __delitem__(self, key):
Victor Stinner6d101392013-04-14 16:35:04 +0200643 encodedkey = self.encodekey(key)
644 self.unsetenv(encodedkey)
645 try:
646 del self._data[encodedkey]
647 except KeyError:
648 # raise KeyError with the original key value
Victor Stinner0c2dd0c2013-08-23 19:19:15 +0200649 raise KeyError(key) from None
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000650
Skip Montanaro289bc052007-08-17 02:30:27 +0000651 def __iter__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000652 for key in self._data:
Victor Stinner84ae1182010-05-06 22:05:07 +0000653 yield self.decodekey(key)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000654
Skip Montanaro289bc052007-08-17 02:30:27 +0000655 def __len__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000656 return len(self._data)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000657
658 def __repr__(self):
Victor Stinnerbed71172010-07-28 21:25:42 +0000659 return 'environ({{{}}})'.format(', '.join(
Victor Stinnerd73c1a32010-07-28 21:23:23 +0000660 ('{!r}: {!r}'.format(self.decodekey(key), self.decodevalue(value))
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000661 for key, value in self._data.items())))
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000662
Skip Montanaro289bc052007-08-17 02:30:27 +0000663 def copy(self):
664 return dict(self)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000665
Skip Montanaro289bc052007-08-17 02:30:27 +0000666 def setdefault(self, key, value):
667 if key not in self:
668 self[key] = value
669 return self[key]
670
671try:
672 _putenv = putenv
673except NameError:
674 _putenv = lambda key, value: None
Richard Oudkerkc41917f2013-05-07 14:36:51 +0100675else:
676 if "putenv" not in __all__:
677 __all__.append("putenv")
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000678
Skip Montanaro289bc052007-08-17 02:30:27 +0000679try:
680 _unsetenv = unsetenv
681except NameError:
682 _unsetenv = lambda key: _putenv(key, "")
Richard Oudkerkc41917f2013-05-07 14:36:51 +0100683else:
684 if "unsetenv" not in __all__:
685 __all__.append("unsetenv")
Guido van Rossumc524d952001-10-19 01:31:59 +0000686
Victor Stinner84ae1182010-05-06 22:05:07 +0000687def _createenviron():
Jesus Cea4791a242012-10-05 03:15:39 +0200688 if name == 'nt':
Victor Stinner84ae1182010-05-06 22:05:07 +0000689 # Where Env Var Names Must Be UPPERCASE
690 def check_str(value):
691 if not isinstance(value, str):
692 raise TypeError("str expected, not %s" % type(value).__name__)
693 return value
694 encode = check_str
695 decode = str
696 def encodekey(key):
697 return encode(key).upper()
698 data = {}
699 for key, value in environ.items():
700 data[encodekey(key)] = value
701 else:
702 # Where Env Var Names Can Be Mixed Case
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000703 encoding = sys.getfilesystemencoding()
Victor Stinner84ae1182010-05-06 22:05:07 +0000704 def encode(value):
705 if not isinstance(value, str):
706 raise TypeError("str expected, not %s" % type(value).__name__)
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000707 return value.encode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000708 def decode(value):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000709 return value.decode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000710 encodekey = encode
711 data = environ
712 return _Environ(data,
713 encodekey, decode,
714 encode, decode,
715 _putenv, _unsetenv)
Guido van Rossumc524d952001-10-19 01:31:59 +0000716
Victor Stinner84ae1182010-05-06 22:05:07 +0000717# unicode environ
718environ = _createenviron()
719del _createenviron
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000720
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000721
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000722def getenv(key, default=None):
Tim Peters2c60f7a2003-01-29 03:49:43 +0000723 """Get an environment variable, return None if it doesn't exist.
Victor Stinner84ae1182010-05-06 22:05:07 +0000724 The optional second argument can specify an alternate default.
725 key, default and the result are str."""
Tim Peters2c60f7a2003-01-29 03:49:43 +0000726 return environ.get(key, default)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000727
Jesus Cea4791a242012-10-05 03:15:39 +0200728supports_bytes_environ = (name != 'nt')
Victor Stinnerb745a742010-05-18 17:17:23 +0000729__all__.extend(("getenv", "supports_bytes_environ"))
730
731if supports_bytes_environ:
Victor Stinner84ae1182010-05-06 22:05:07 +0000732 def _check_bytes(value):
733 if not isinstance(value, bytes):
734 raise TypeError("bytes expected, not %s" % type(value).__name__)
735 return value
736
737 # bytes environ
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000738 environb = _Environ(environ._data,
Victor Stinner84ae1182010-05-06 22:05:07 +0000739 _check_bytes, bytes,
740 _check_bytes, bytes,
741 _putenv, _unsetenv)
742 del _check_bytes
743
744 def getenvb(key, default=None):
745 """Get an environment variable, return None if it doesn't exist.
746 The optional second argument can specify an alternate default.
747 key, default and the result are bytes."""
748 return environb.get(key, default)
Victor Stinner70120e22010-07-29 17:19:38 +0000749
750 __all__.extend(("environb", "getenvb"))
Victor Stinner84ae1182010-05-06 22:05:07 +0000751
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000752def _fscodec():
753 encoding = sys.getfilesystemencoding()
754 if encoding == 'mbcs':
Victor Stinnere882aac2010-10-24 21:12:26 +0000755 errors = 'strict'
Victor Stinner313a1202010-06-11 23:56:51 +0000756 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000757 errors = 'surrogateescape'
Victor Stinnere8d51452010-08-19 01:05:19 +0000758
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000759 def fsencode(filename):
760 """
761 Encode filename to the filesystem encoding with 'surrogateescape' error
762 handler, return bytes unchanged. On Windows, use 'strict' error handler if
763 the file system encoding is 'mbcs' (which is the default encoding).
764 """
765 if isinstance(filename, bytes):
766 return filename
767 elif isinstance(filename, str):
768 return filename.encode(encoding, errors)
Victor Stinnere8d51452010-08-19 01:05:19 +0000769 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000770 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
771
772 def fsdecode(filename):
773 """
774 Decode filename from the filesystem encoding with 'surrogateescape' error
775 handler, return str unchanged. On Windows, use 'strict' error handler if
776 the file system encoding is 'mbcs' (which is the default encoding).
777 """
778 if isinstance(filename, str):
779 return filename
780 elif isinstance(filename, bytes):
781 return filename.decode(encoding, errors)
782 else:
783 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
784
785 return fsencode, fsdecode
786
787fsencode, fsdecode = _fscodec()
788del _fscodec
Victor Stinner449c4662010-05-08 11:10:09 +0000789
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000790# Supply spawn*() (probably only for Unix)
791if _exists("fork") and not _exists("spawnv") and _exists("execv"):
792
793 P_WAIT = 0
794 P_NOWAIT = P_NOWAITO = 1
795
Petri Lehtinen3bc37f22012-05-23 21:36:16 +0300796 __all__.extend(["P_WAIT", "P_NOWAIT", "P_NOWAITO"])
797
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000798 # XXX Should we support P_DETACH? I suppose it could fork()**2
799 # and close the std I/O streams. Also, P_OVERLAY is the same
800 # as execv*()?
801
802 def _spawnvef(mode, file, args, env, func):
803 # Internal helper; func is the exec*() function to use
804 pid = fork()
805 if not pid:
806 # Child
807 try:
808 if env is None:
809 func(file, args)
810 else:
811 func(file, args, env)
812 except:
813 _exit(127)
814 else:
815 # Parent
816 if mode == P_NOWAIT:
817 return pid # Caller is responsible for waiting!
818 while 1:
819 wpid, sts = waitpid(pid, 0)
820 if WIFSTOPPED(sts):
821 continue
822 elif WIFSIGNALED(sts):
823 return -WTERMSIG(sts)
824 elif WIFEXITED(sts):
825 return WEXITSTATUS(sts)
826 else:
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200827 raise OSError("Not stopped, signaled or exited???")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000828
829 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000830 """spawnv(mode, file, args) -> integer
831
832Execute file with arguments from args in a subprocess.
833If mode == P_NOWAIT return the pid of the process.
834If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000835otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000836 return _spawnvef(mode, file, args, None, execv)
837
838 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000839 """spawnve(mode, file, args, env) -> integer
840
841Execute file with arguments from args in a subprocess with the
842specified environment.
843If mode == P_NOWAIT return the pid of the process.
844If mode == P_WAIT return the process's exit code if it exits normally;
845otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000846 return _spawnvef(mode, file, args, env, execve)
847
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000848 # Note: spawnvp[e] is't currently supported on Windows
849
850 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000851 """spawnvp(mode, file, args) -> integer
852
853Execute file (which is looked for along $PATH) with arguments from
854args in a subprocess.
855If mode == P_NOWAIT return the pid of the process.
856If mode == P_WAIT return the process's exit code if it exits normally;
857otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000858 return _spawnvef(mode, file, args, None, execvp)
859
860 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000861 """spawnvpe(mode, file, args, env) -> integer
862
863Execute file (which is looked for along $PATH) with arguments from
864args in a subprocess with the supplied environment.
865If mode == P_NOWAIT return the pid of the process.
866If mode == P_WAIT return the process's exit code if it exits normally;
867otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000868 return _spawnvef(mode, file, args, env, execvpe)
869
Richard Oudkerkad34ef82013-05-07 14:23:42 +0100870
871 __all__.extend(["spawnv", "spawnve", "spawnvp", "spawnvpe"])
872
873
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000874if _exists("spawnv"):
875 # These aren't supplied by the basic Windows code
876 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000877
878 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000879 """spawnl(mode, file, *args) -> integer
880
881Execute file with arguments from args in a subprocess.
882If mode == P_NOWAIT return the pid of the process.
883If mode == P_WAIT return the process's exit code if it exits normally;
884otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000885 return spawnv(mode, file, args)
886
887 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000888 """spawnle(mode, file, *args, env) -> integer
889
890Execute file with arguments from args in a subprocess with the
891supplied environment.
892If mode == P_NOWAIT return the pid of the process.
893If mode == P_WAIT return the process's exit code if it exits normally;
894otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000895 env = args[-1]
896 return spawnve(mode, file, args[:-1], env)
897
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000898
Richard Oudkerkad34ef82013-05-07 14:23:42 +0100899 __all__.extend(["spawnl", "spawnle"])
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000900
901
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000902if _exists("spawnvp"):
903 # At the moment, Windows doesn't implement spawnvp[e],
904 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000905 def spawnlp(mode, file, *args):
Neal Norwitzb7f68102003-07-02 02:49:33 +0000906 """spawnlp(mode, file, *args) -> integer
Guido van Rossume0cd2912000-04-21 18:35:36 +0000907
908Execute file (which is looked for along $PATH) with arguments from
909args in a subprocess with the supplied environment.
910If mode == P_NOWAIT return the pid of the process.
911If mode == P_WAIT return the process's exit code if it exits normally;
912otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000913 return spawnvp(mode, file, args)
914
915 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000916 """spawnlpe(mode, file, *args, env) -> integer
917
918Execute file (which is looked for along $PATH) with arguments from
919args in a subprocess with the supplied environment.
920If mode == P_NOWAIT return the pid of the process.
921If mode == P_WAIT return the process's exit code if it exits normally;
922otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000923 env = args[-1]
924 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000925
926
Richard Oudkerkad34ef82013-05-07 14:23:42 +0100927 __all__.extend(["spawnlp", "spawnlpe"])
928
Skip Montanaro269b83b2001-02-06 01:07:02 +0000929
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000930# Supply os.popen()
Antoine Pitrou877766d2011-03-19 17:00:37 +0100931def popen(cmd, mode="r", buffering=-1):
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000932 if not isinstance(cmd, str):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000933 raise TypeError("invalid cmd type (%s, expected string)" % type(cmd))
934 if mode not in ("r", "w"):
935 raise ValueError("invalid mode %r" % mode)
Benjamin Petersonb29614e2012-10-09 11:16:03 -0400936 if buffering == 0 or buffering is None:
Antoine Pitrou877766d2011-03-19 17:00:37 +0100937 raise ValueError("popen() does not support unbuffered streams")
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000938 import subprocess, io
939 if mode == "r":
940 proc = subprocess.Popen(cmd,
941 shell=True,
942 stdout=subprocess.PIPE,
943 bufsize=buffering)
944 return _wrap_close(io.TextIOWrapper(proc.stdout), proc)
945 else:
946 proc = subprocess.Popen(cmd,
947 shell=True,
948 stdin=subprocess.PIPE,
949 bufsize=buffering)
950 return _wrap_close(io.TextIOWrapper(proc.stdin), proc)
951
952# Helper for popen() -- a proxy for a file whose close waits for the process
953class _wrap_close:
954 def __init__(self, stream, proc):
955 self._stream = stream
956 self._proc = proc
957 def close(self):
958 self._stream.close()
Amaury Forgeot d'Arc97e5f282009-07-11 09:35:13 +0000959 returncode = self._proc.wait()
960 if returncode == 0:
961 return None
962 if name == 'nt':
963 return returncode
964 else:
965 return returncode << 8 # Shift left to match old behavior
Antoine Pitrouac625352009-12-09 00:01:27 +0000966 def __enter__(self):
967 return self
968 def __exit__(self, *args):
969 self.close()
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000970 def __getattr__(self, name):
971 return getattr(self._stream, name)
Thomas Heller476157b2007-09-04 11:27:47 +0000972 def __iter__(self):
973 return iter(self._stream)
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000974
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +0000975# Supply os.fdopen()
976def fdopen(fd, *args, **kwargs):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000977 if not isinstance(fd, int):
978 raise TypeError("invalid fd type (%s, expected integer)" % type(fd))
979 import io
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +0000980 return io.open(fd, *args, **kwargs)