blob: 27b241ae97d50bf05bc7c067d8439019365ca246 [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:
Martin Pantera82642f2015-11-19 04:48:44 +0000229 # Defeats race condition when another thread 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)
Martin Pantera82642f2015-11-19 04:48:44 +0000238 except OSError:
239 # Cannot rely on checking for EEXIST, since the operating system
240 # could give priority to other errors like EACCES or EROFS
241 if not exist_ok or not path.isdir(name):
Terry Reedy5a22b652010-12-02 07:05:56 +0000242 raise
Guido van Rossum4def7de1998-07-24 20:48:03 +0000243
244def removedirs(name):
Zachary Warea22ae212014-03-20 09:42:01 -0500245 """removedirs(name)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000246
Fredrik Lundh96c1c7a2005-11-12 15:55:04 +0000247 Super-rmdir; remove a leaf directory and all empty intermediate
Guido van Rossum4def7de1998-07-24 20:48:03 +0000248 ones. Works like rmdir except that, if the leaf directory is
249 successfully removed, directories corresponding to rightmost path
Tim Petersc4e09402003-04-25 07:11:48 +0000250 segments will be pruned away until either the whole path is
Guido van Rossum4def7de1998-07-24 20:48:03 +0000251 consumed or an error occurs. Errors during this latter phase are
252 ignored -- they generally mean that a directory was not empty.
253
254 """
255 rmdir(name)
256 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000257 if not tail:
258 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000259 while head and tail:
260 try:
261 rmdir(head)
Andrew Svetlov2552bc02012-12-24 21:47:24 +0200262 except OSError:
Guido van Rossum4def7de1998-07-24 20:48:03 +0000263 break
264 head, tail = path.split(head)
265
266def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000267 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000268
269 Super-rename; create directories as necessary and delete any left
270 empty. Works like rename, except creation of any intermediate
271 directories needed to make the new pathname good is attempted
272 first. After the rename, directories corresponding to rightmost
Benjamin Peterson52a3b742015-04-13 20:24:10 -0400273 path segments of the old name will be pruned until either the
Guido van Rossum4def7de1998-07-24 20:48:03 +0000274 whole path is consumed or a nonempty directory is found.
275
276 Note: this function can fail with the new directory structure made
277 if you lack permissions needed to unlink the leaf directory or
278 file.
279
280 """
281 head, tail = path.split(new)
282 if head and tail and not path.exists(head):
283 makedirs(head)
284 rename(old, new)
285 head, tail = path.split(old)
286 if head and tail:
287 try:
288 removedirs(head)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200289 except OSError:
Guido van Rossum4def7de1998-07-24 20:48:03 +0000290 pass
291
Skip Montanaro269b83b2001-02-06 01:07:02 +0000292__all__.extend(["makedirs", "removedirs", "renames"])
293
Guido van Rossumd8faa362007-04-27 19:54:29 +0000294def walk(top, topdown=True, onerror=None, followlinks=False):
Tim Petersc4e09402003-04-25 07:11:48 +0000295 """Directory tree generator.
296
297 For each directory in the directory tree rooted at top (including top
298 itself, but excluding '.' and '..'), yields a 3-tuple
299
300 dirpath, dirnames, filenames
301
302 dirpath is a string, the path to the directory. dirnames is a list of
303 the names of the subdirectories in dirpath (excluding '.' and '..').
304 filenames is a list of the names of the non-directory files in dirpath.
305 Note that the names in the lists are just names, with no path components.
306 To get a full path (which begins with top) to a file or directory in
307 dirpath, do os.path.join(dirpath, name).
308
309 If optional arg 'topdown' is true or not specified, the triple for a
310 directory is generated before the triples for any of its subdirectories
311 (directories are generated top down). If topdown is false, the triple
312 for a directory is generated after the triples for all of its
313 subdirectories (directories are generated bottom up).
314
315 When topdown is true, the caller can modify the dirnames list in-place
316 (e.g., via del or slice assignment), and walk will only recurse into the
Benjamin Petersone58e0c72014-06-15 20:51:12 -0700317 subdirectories whose names remain in dirnames; this can be used to prune the
318 search, or to impose a specific order of visiting. Modifying dirnames when
319 topdown is false is ineffective, since the directories in dirnames have
320 already been generated by the time dirnames itself is generated. No matter
321 the value of topdown, the list of subdirectories is retrieved before the
322 tuples for the directory and its subdirectories are generated.
Tim Petersc4e09402003-04-25 07:11:48 +0000323
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000324 By default errors from the os.listdir() call are ignored. If
325 optional arg 'onerror' is specified, it should be a function; it
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200326 will be called with one argument, an OSError instance. It can
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000327 report the error to continue with the walk, or raise the exception
328 to abort the walk. Note that the filename is available as the
329 filename attribute of the exception object.
330
Guido van Rossumd8faa362007-04-27 19:54:29 +0000331 By default, os.walk does not follow symbolic links to subdirectories on
332 systems that support them. In order to get this functionality, set the
333 optional argument 'followlinks' to true.
334
Tim Petersc4e09402003-04-25 07:11:48 +0000335 Caution: if you pass a relative pathname for top, don't change the
336 current working directory between resumptions of walk. walk never
337 changes the current directory, and assumes that the client doesn't
338 either.
339
340 Example:
341
Christian Heimes5d8da202008-05-06 13:58:24 +0000342 import os
Tim Petersc4e09402003-04-25 07:11:48 +0000343 from os.path import join, getsize
Christian Heimes5d8da202008-05-06 13:58:24 +0000344 for root, dirs, files in os.walk('python/Lib/email'):
Neal Norwitz752abd02008-05-13 04:55:24 +0000345 print(root, "consumes", end="")
346 print(sum([getsize(join(root, name)) for name in files]), end="")
347 print("bytes in", len(files), "non-directory files")
Tim Petersc4e09402003-04-25 07:11:48 +0000348 if 'CVS' in dirs:
349 dirs.remove('CVS') # don't visit CVS directories
Benjamin Petersone58e0c72014-06-15 20:51:12 -0700350
Tim Petersc4e09402003-04-25 07:11:48 +0000351 """
352
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000353 islink, join, isdir = path.islink, path.join, path.isdir
Tim Petersc4e09402003-04-25 07:11:48 +0000354
355 # We may not have read permission for top, in which case we can't
Alexandre Vassalotti4e6531e2008-05-09 20:00:17 +0000356 # get a list of the files the directory contains. os.walk
Tim Petersc4e09402003-04-25 07:11:48 +0000357 # always suppressed the exception then, rather than blow up for a
358 # minor reason when (say) a thousand readable directories are still
359 # left to visit. That logic is copied here.
360 try:
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200361 # Note that listdir is global in this module due
Tim Petersc4e09402003-04-25 07:11:48 +0000362 # to earlier import-*.
363 names = listdir(top)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200364 except OSError as err:
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000365 if onerror is not None:
366 onerror(err)
Tim Petersc4e09402003-04-25 07:11:48 +0000367 return
368
369 dirs, nondirs = [], []
370 for name in names:
371 if isdir(join(top, name)):
372 dirs.append(name)
373 else:
374 nondirs.append(name)
375
376 if topdown:
377 yield top, dirs, nondirs
378 for name in dirs:
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000379 new_path = join(top, name)
380 if followlinks or not islink(new_path):
Benjamin Peterson569d0872012-05-10 16:17:35 -0500381 yield from walk(new_path, topdown, onerror, followlinks)
Tim Petersc4e09402003-04-25 07:11:48 +0000382 if not topdown:
383 yield top, dirs, nondirs
384
385__all__.append("walk")
386
Larry Hastingsc48fe982012-06-25 04:49:05 -0700387if {open, stat} <= supports_dir_fd and {listdir, stat} <= supports_fd:
Charles-François Natali7372b062012-02-05 15:15:38 +0100388
Larry Hastingsb4038062012-07-15 10:57:38 -0700389 def fwalk(top=".", topdown=True, onerror=None, *, follow_symlinks=False, dir_fd=None):
Charles-François Natali7372b062012-02-05 15:15:38 +0100390 """Directory tree generator.
391
392 This behaves exactly like walk(), except that it yields a 4-tuple
393
394 dirpath, dirnames, filenames, dirfd
395
396 `dirpath`, `dirnames` and `filenames` are identical to walk() output,
397 and `dirfd` is a file descriptor referring to the directory `dirpath`.
398
Larry Hastingsc48fe982012-06-25 04:49:05 -0700399 The advantage of fwalk() over walk() is that it's safe against symlink
Larry Hastingsb4038062012-07-15 10:57:38 -0700400 races (when follow_symlinks is False).
Charles-François Natali7372b062012-02-05 15:15:38 +0100401
Larry Hastingsc48fe982012-06-25 04:49:05 -0700402 If dir_fd is not None, it should be a file descriptor open to a directory,
403 and top should be relative; top will then be relative to that directory.
404 (dir_fd is always supported for fwalk.)
405
Charles-François Natali7372b062012-02-05 15:15:38 +0100406 Caution:
407 Since fwalk() yields file descriptors, those are only valid until the
408 next iteration step, so you should dup() them if you want to keep them
409 for a longer period.
410
411 Example:
412
413 import os
414 for root, dirs, files, rootfd in os.fwalk('python/Lib/email'):
415 print(root, "consumes", end="")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700416 print(sum([os.stat(name, dir_fd=rootfd).st_size for name in files]),
Charles-François Natali7372b062012-02-05 15:15:38 +0100417 end="")
418 print("bytes in", len(files), "non-directory files")
419 if 'CVS' in dirs:
420 dirs.remove('CVS') # don't visit CVS directories
421 """
422 # Note: To guard against symlink races, we use the standard
423 # lstat()/open()/fstat() trick.
Larry Hastingsc48fe982012-06-25 04:49:05 -0700424 orig_st = stat(top, follow_symlinks=False, dir_fd=dir_fd)
425 topfd = open(top, O_RDONLY, dir_fd=dir_fd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100426 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700427 if (follow_symlinks or (st.S_ISDIR(orig_st.st_mode) and
428 path.samestat(orig_st, stat(topfd)))):
429 yield from _fwalk(topfd, top, topdown, onerror, follow_symlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100430 finally:
431 close(topfd)
432
Larry Hastingsb4038062012-07-15 10:57:38 -0700433 def _fwalk(topfd, toppath, topdown, onerror, follow_symlinks):
Charles-François Natali7372b062012-02-05 15:15:38 +0100434 # Note: This uses O(depth of the directory tree) file descriptors: if
435 # necessary, it can be adapted to only require O(1) FDs, see issue
436 # #13734.
437
Larry Hastings9cf065c2012-06-22 16:30:09 -0700438 names = listdir(topfd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100439 dirs, nondirs = [], []
440 for name in names:
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200441 try:
442 # Here, we don't use AT_SYMLINK_NOFOLLOW to be consistent with
443 # walk() which reports symlinks to directories as directories.
444 # We do however check for symlinks before recursing into
445 # a subdirectory.
Larry Hastings9cf065c2012-06-22 16:30:09 -0700446 if st.S_ISDIR(stat(name, dir_fd=topfd).st_mode):
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200447 dirs.append(name)
448 else:
449 nondirs.append(name)
450 except FileNotFoundError:
451 try:
452 # Add dangling symlinks, ignore disappeared files
Larry Hastings9cf065c2012-06-22 16:30:09 -0700453 if st.S_ISLNK(stat(name, dir_fd=topfd, follow_symlinks=False)
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200454 .st_mode):
455 nondirs.append(name)
456 except FileNotFoundError:
457 continue
Charles-François Natali7372b062012-02-05 15:15:38 +0100458
459 if topdown:
460 yield toppath, dirs, nondirs, topfd
461
462 for name in dirs:
463 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700464 orig_st = stat(name, dir_fd=topfd, follow_symlinks=follow_symlinks)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700465 dirfd = open(name, O_RDONLY, dir_fd=topfd)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200466 except OSError as err:
Charles-François Natali7372b062012-02-05 15:15:38 +0100467 if onerror is not None:
468 onerror(err)
469 return
470 try:
Larry Hastingsb4038062012-07-15 10:57:38 -0700471 if follow_symlinks or path.samestat(orig_st, stat(dirfd)):
Charles-François Natali7372b062012-02-05 15:15:38 +0100472 dirpath = path.join(toppath, name)
Larry Hastingsb4038062012-07-15 10:57:38 -0700473 yield from _fwalk(dirfd, dirpath, topdown, onerror, follow_symlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100474 finally:
475 close(dirfd)
476
477 if not topdown:
478 yield toppath, dirs, nondirs, topfd
479
480 __all__.append("fwalk")
481
Guido van Rossuma28dab51997-08-29 22:36:47 +0000482# Make sure os.environ exists, at least
483try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000484 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000485except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000486 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000487
Guido van Rossume65cce51993-11-08 15:05:21 +0000488def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000489 """execl(file, *args)
490
491 Execute the executable file with argument list args, replacing the
492 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000493 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000494
495def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000496 """execle(file, *args, env)
497
498 Execute the executable file with argument list args and
499 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000500 env = args[-1]
501 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000502
503def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000504 """execlp(file, *args)
505
506 Execute the executable file (which is searched for along $PATH)
507 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000508 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000509
Guido van Rossum030afb11995-03-14 17:27:18 +0000510def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000511 """execlpe(file, *args, env)
512
513 Execute the executable file (which is searched for along $PATH)
514 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000515 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000516 env = args[-1]
517 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000518
Guido van Rossume65cce51993-11-08 15:05:21 +0000519def execvp(file, args):
Matthias Klosea09c54f2010-01-31 16:48:44 +0000520 """execvp(file, args)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000521
522 Execute the executable file (which is searched for along $PATH)
523 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000524 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000525 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000526
527def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000528 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000529
530 Execute the executable file (which is searched for along $PATH)
531 with argument list args and environment env , replacing the
532 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000533 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000534 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000535
Skip Montanaro269b83b2001-02-06 01:07:02 +0000536__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
537
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000538def _execvpe(file, args, env=None):
539 if env is not None:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000540 exec_func = execve
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000541 argrest = (args, env)
542 else:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000543 exec_func = execv
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000544 argrest = (args,)
545 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000546
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000547 head, tail = path.split(file)
548 if head:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000549 exec_func(file, *argrest)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000550 return
Guido van Rossume7ba4952007-06-06 23:52:48 +0000551 last_exc = saved_exc = None
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000552 saved_tb = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000553 path_list = get_exec_path(env)
554 if name != 'nt':
555 file = fsencode(file)
556 path_list = map(fsencode, path_list)
557 for dir in path_list:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000558 fullname = path.join(dir, file)
559 try:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000560 exec_func(fullname, *argrest)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200561 except OSError as e:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000562 last_exc = e
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000563 tb = sys.exc_info()[2]
Christian Heimes45f9af32007-11-27 21:50:00 +0000564 if (e.errno != errno.ENOENT and e.errno != errno.ENOTDIR
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000565 and saved_exc is None):
566 saved_exc = e
567 saved_tb = tb
568 if saved_exc:
Benjamin Peterson4b068192009-02-20 03:19:25 +0000569 raise saved_exc.with_traceback(saved_tb)
570 raise last_exc.with_traceback(tb)
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000571
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000572
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000573def get_exec_path(env=None):
574 """Returns the sequence of directories that will be searched for the
575 named executable (similar to a shell) when launching a process.
576
577 *env* must be an environment variable dict or None. If *env* is None,
578 os.environ will be used.
579 """
Victor Stinner273b7662010-11-06 12:59:33 +0000580 # Use a local import instead of a global import to limit the number of
581 # modules loaded at startup: the os module is always loaded at startup by
582 # Python. It may also avoid a bootstrap issue.
Victor Stinner6f35eda2010-10-29 00:38:58 +0000583 import warnings
584
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000585 if env is None:
586 env = environ
Victor Stinnerb745a742010-05-18 17:17:23 +0000587
Victor Stinnerbb4f2182010-11-07 15:43:39 +0000588 # {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a
589 # BytesWarning when using python -b or python -bb: ignore the warning
Victor Stinner273b7662010-11-06 12:59:33 +0000590 with warnings.catch_warnings():
591 warnings.simplefilter("ignore", BytesWarning)
Victor Stinnerb745a742010-05-18 17:17:23 +0000592
Victor Stinnerb745a742010-05-18 17:17:23 +0000593 try:
Victor Stinner273b7662010-11-06 12:59:33 +0000594 path_list = env.get('PATH')
595 except TypeError:
596 path_list = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000597
Victor Stinner273b7662010-11-06 12:59:33 +0000598 if supports_bytes_environ:
599 try:
600 path_listb = env[b'PATH']
601 except (KeyError, TypeError):
602 pass
603 else:
604 if path_list is not None:
605 raise ValueError(
606 "env cannot contain 'PATH' and b'PATH' keys")
607 path_list = path_listb
608
609 if path_list is not None and isinstance(path_list, bytes):
610 path_list = fsdecode(path_list)
Victor Stinnerb745a742010-05-18 17:17:23 +0000611
612 if path_list is None:
613 path_list = defpath
614 return path_list.split(pathsep)
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000615
616
Skip Montanaro289bc052007-08-17 02:30:27 +0000617# Change environ to automatically call putenv(), unsetenv if they exist.
Christian Heimesf1dc3ee2013-10-13 02:04:20 +0200618from _collections_abc import MutableMapping
Skip Montanaro289bc052007-08-17 02:30:27 +0000619
620class _Environ(MutableMapping):
Victor Stinner84ae1182010-05-06 22:05:07 +0000621 def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv):
622 self.encodekey = encodekey
623 self.decodekey = decodekey
624 self.encodevalue = encodevalue
625 self.decodevalue = decodevalue
Skip Montanaro289bc052007-08-17 02:30:27 +0000626 self.putenv = putenv
627 self.unsetenv = unsetenv
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000628 self._data = data
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000629
Skip Montanaro289bc052007-08-17 02:30:27 +0000630 def __getitem__(self, key):
Victor Stinner6d101392013-04-14 16:35:04 +0200631 try:
632 value = self._data[self.encodekey(key)]
633 except KeyError:
634 # raise KeyError with the original key value
Victor Stinner0c2dd0c2013-08-23 19:19:15 +0200635 raise KeyError(key) from None
Victor Stinner84ae1182010-05-06 22:05:07 +0000636 return self.decodevalue(value)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000637
Skip Montanaro289bc052007-08-17 02:30:27 +0000638 def __setitem__(self, key, value):
Victor Stinner84ae1182010-05-06 22:05:07 +0000639 key = self.encodekey(key)
640 value = self.encodevalue(value)
Skip Montanaro289bc052007-08-17 02:30:27 +0000641 self.putenv(key, value)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000642 self._data[key] = value
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000643
Skip Montanaro289bc052007-08-17 02:30:27 +0000644 def __delitem__(self, key):
Victor Stinner6d101392013-04-14 16:35:04 +0200645 encodedkey = self.encodekey(key)
646 self.unsetenv(encodedkey)
647 try:
648 del self._data[encodedkey]
649 except KeyError:
650 # raise KeyError with the original key value
Victor Stinner0c2dd0c2013-08-23 19:19:15 +0200651 raise KeyError(key) from None
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000652
Skip Montanaro289bc052007-08-17 02:30:27 +0000653 def __iter__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000654 for key in self._data:
Victor Stinner84ae1182010-05-06 22:05:07 +0000655 yield self.decodekey(key)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000656
Skip Montanaro289bc052007-08-17 02:30:27 +0000657 def __len__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000658 return len(self._data)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000659
660 def __repr__(self):
Victor Stinnerbed71172010-07-28 21:25:42 +0000661 return 'environ({{{}}})'.format(', '.join(
Victor Stinnerd73c1a32010-07-28 21:23:23 +0000662 ('{!r}: {!r}'.format(self.decodekey(key), self.decodevalue(value))
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000663 for key, value in self._data.items())))
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000664
Skip Montanaro289bc052007-08-17 02:30:27 +0000665 def copy(self):
666 return dict(self)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000667
Skip Montanaro289bc052007-08-17 02:30:27 +0000668 def setdefault(self, key, value):
669 if key not in self:
670 self[key] = value
671 return self[key]
672
673try:
674 _putenv = putenv
675except NameError:
676 _putenv = lambda key, value: None
Richard Oudkerkc41917f2013-05-07 14:36:51 +0100677else:
678 if "putenv" not in __all__:
679 __all__.append("putenv")
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000680
Skip Montanaro289bc052007-08-17 02:30:27 +0000681try:
682 _unsetenv = unsetenv
683except NameError:
684 _unsetenv = lambda key: _putenv(key, "")
Richard Oudkerkc41917f2013-05-07 14:36:51 +0100685else:
686 if "unsetenv" not in __all__:
687 __all__.append("unsetenv")
Guido van Rossumc524d952001-10-19 01:31:59 +0000688
Victor Stinner84ae1182010-05-06 22:05:07 +0000689def _createenviron():
Jesus Cea4791a242012-10-05 03:15:39 +0200690 if name == 'nt':
Victor Stinner84ae1182010-05-06 22:05:07 +0000691 # Where Env Var Names Must Be UPPERCASE
692 def check_str(value):
693 if not isinstance(value, str):
694 raise TypeError("str expected, not %s" % type(value).__name__)
695 return value
696 encode = check_str
697 decode = str
698 def encodekey(key):
699 return encode(key).upper()
700 data = {}
701 for key, value in environ.items():
702 data[encodekey(key)] = value
703 else:
704 # Where Env Var Names Can Be Mixed Case
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000705 encoding = sys.getfilesystemencoding()
Victor Stinner84ae1182010-05-06 22:05:07 +0000706 def encode(value):
707 if not isinstance(value, str):
708 raise TypeError("str expected, not %s" % type(value).__name__)
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000709 return value.encode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000710 def decode(value):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000711 return value.decode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000712 encodekey = encode
713 data = environ
714 return _Environ(data,
715 encodekey, decode,
716 encode, decode,
717 _putenv, _unsetenv)
Guido van Rossumc524d952001-10-19 01:31:59 +0000718
Victor Stinner84ae1182010-05-06 22:05:07 +0000719# unicode environ
720environ = _createenviron()
721del _createenviron
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000722
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000723
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000724def getenv(key, default=None):
Tim Peters2c60f7a2003-01-29 03:49:43 +0000725 """Get an environment variable, return None if it doesn't exist.
Victor Stinner84ae1182010-05-06 22:05:07 +0000726 The optional second argument can specify an alternate default.
727 key, default and the result are str."""
Tim Peters2c60f7a2003-01-29 03:49:43 +0000728 return environ.get(key, default)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000729
Jesus Cea4791a242012-10-05 03:15:39 +0200730supports_bytes_environ = (name != 'nt')
Victor Stinnerb745a742010-05-18 17:17:23 +0000731__all__.extend(("getenv", "supports_bytes_environ"))
732
733if supports_bytes_environ:
Victor Stinner84ae1182010-05-06 22:05:07 +0000734 def _check_bytes(value):
735 if not isinstance(value, bytes):
736 raise TypeError("bytes expected, not %s" % type(value).__name__)
737 return value
738
739 # bytes environ
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000740 environb = _Environ(environ._data,
Victor Stinner84ae1182010-05-06 22:05:07 +0000741 _check_bytes, bytes,
742 _check_bytes, bytes,
743 _putenv, _unsetenv)
744 del _check_bytes
745
746 def getenvb(key, default=None):
747 """Get an environment variable, return None if it doesn't exist.
748 The optional second argument can specify an alternate default.
749 key, default and the result are bytes."""
750 return environb.get(key, default)
Victor Stinner70120e22010-07-29 17:19:38 +0000751
752 __all__.extend(("environb", "getenvb"))
Victor Stinner84ae1182010-05-06 22:05:07 +0000753
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000754def _fscodec():
755 encoding = sys.getfilesystemencoding()
756 if encoding == 'mbcs':
Victor Stinnere882aac2010-10-24 21:12:26 +0000757 errors = 'strict'
Victor Stinner313a1202010-06-11 23:56:51 +0000758 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000759 errors = 'surrogateescape'
Victor Stinnere8d51452010-08-19 01:05:19 +0000760
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000761 def fsencode(filename):
762 """
763 Encode filename to the filesystem encoding with 'surrogateescape' error
764 handler, return bytes unchanged. On Windows, use 'strict' error handler if
765 the file system encoding is 'mbcs' (which is the default encoding).
766 """
767 if isinstance(filename, bytes):
768 return filename
769 elif isinstance(filename, str):
770 return filename.encode(encoding, errors)
Victor Stinnere8d51452010-08-19 01:05:19 +0000771 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000772 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
773
774 def fsdecode(filename):
775 """
776 Decode filename from the filesystem encoding with 'surrogateescape' error
777 handler, return str unchanged. On Windows, use 'strict' error handler if
778 the file system encoding is 'mbcs' (which is the default encoding).
779 """
780 if isinstance(filename, str):
781 return filename
782 elif isinstance(filename, bytes):
783 return filename.decode(encoding, errors)
784 else:
785 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
786
787 return fsencode, fsdecode
788
789fsencode, fsdecode = _fscodec()
790del _fscodec
Victor Stinner449c4662010-05-08 11:10:09 +0000791
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000792# Supply spawn*() (probably only for Unix)
793if _exists("fork") and not _exists("spawnv") and _exists("execv"):
794
795 P_WAIT = 0
796 P_NOWAIT = P_NOWAITO = 1
797
Petri Lehtinen3bc37f22012-05-23 21:36:16 +0300798 __all__.extend(["P_WAIT", "P_NOWAIT", "P_NOWAITO"])
799
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000800 # XXX Should we support P_DETACH? I suppose it could fork()**2
801 # and close the std I/O streams. Also, P_OVERLAY is the same
802 # as execv*()?
803
804 def _spawnvef(mode, file, args, env, func):
805 # Internal helper; func is the exec*() function to use
806 pid = fork()
807 if not pid:
808 # Child
809 try:
810 if env is None:
811 func(file, args)
812 else:
813 func(file, args, env)
814 except:
815 _exit(127)
816 else:
817 # Parent
818 if mode == P_NOWAIT:
819 return pid # Caller is responsible for waiting!
820 while 1:
821 wpid, sts = waitpid(pid, 0)
822 if WIFSTOPPED(sts):
823 continue
824 elif WIFSIGNALED(sts):
825 return -WTERMSIG(sts)
826 elif WIFEXITED(sts):
827 return WEXITSTATUS(sts)
828 else:
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200829 raise OSError("Not stopped, signaled or exited???")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000830
831 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000832 """spawnv(mode, file, args) -> integer
833
834Execute file with arguments from args in a subprocess.
835If mode == P_NOWAIT return the pid of the process.
836If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000837otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000838 return _spawnvef(mode, file, args, None, execv)
839
840 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000841 """spawnve(mode, file, args, env) -> integer
842
843Execute file with arguments from args in a subprocess with the
844specified environment.
845If mode == P_NOWAIT return the pid of the process.
846If mode == P_WAIT return the process's exit code if it exits normally;
847otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000848 return _spawnvef(mode, file, args, env, execve)
849
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000850 # Note: spawnvp[e] is't currently supported on Windows
851
852 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000853 """spawnvp(mode, file, args) -> integer
854
855Execute file (which is looked for along $PATH) with arguments from
856args in a subprocess.
857If mode == P_NOWAIT return the pid of the process.
858If mode == P_WAIT return the process's exit code if it exits normally;
859otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000860 return _spawnvef(mode, file, args, None, execvp)
861
862 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000863 """spawnvpe(mode, file, args, env) -> integer
864
865Execute file (which is looked for along $PATH) with arguments from
866args in a subprocess with the supplied environment.
867If mode == P_NOWAIT return the pid of the process.
868If mode == P_WAIT return the process's exit code if it exits normally;
869otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000870 return _spawnvef(mode, file, args, env, execvpe)
871
Richard Oudkerkad34ef82013-05-07 14:23:42 +0100872
873 __all__.extend(["spawnv", "spawnve", "spawnvp", "spawnvpe"])
874
875
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000876if _exists("spawnv"):
877 # These aren't supplied by the basic Windows code
878 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000879
880 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000881 """spawnl(mode, file, *args) -> integer
882
883Execute file with arguments from args in a subprocess.
884If mode == P_NOWAIT return the pid of the process.
885If mode == P_WAIT return the process's exit code if it exits normally;
886otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000887 return spawnv(mode, file, args)
888
889 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000890 """spawnle(mode, file, *args, env) -> integer
891
892Execute file with arguments from args in a subprocess with the
893supplied environment.
894If mode == P_NOWAIT return the pid of the process.
895If mode == P_WAIT return the process's exit code if it exits normally;
896otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000897 env = args[-1]
898 return spawnve(mode, file, args[:-1], env)
899
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000900
Richard Oudkerkad34ef82013-05-07 14:23:42 +0100901 __all__.extend(["spawnl", "spawnle"])
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000902
903
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000904if _exists("spawnvp"):
905 # At the moment, Windows doesn't implement spawnvp[e],
906 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000907 def spawnlp(mode, file, *args):
Neal Norwitzb7f68102003-07-02 02:49:33 +0000908 """spawnlp(mode, file, *args) -> integer
Guido van Rossume0cd2912000-04-21 18:35:36 +0000909
910Execute file (which is looked for along $PATH) with arguments from
911args in a subprocess with the supplied environment.
912If mode == P_NOWAIT return the pid of the process.
913If mode == P_WAIT return the process's exit code if it exits normally;
914otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000915 return spawnvp(mode, file, args)
916
917 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000918 """spawnlpe(mode, file, *args, env) -> integer
919
920Execute file (which is looked for along $PATH) with arguments from
921args in a subprocess with the supplied environment.
922If mode == P_NOWAIT return the pid of the process.
923If mode == P_WAIT return the process's exit code if it exits normally;
924otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000925 env = args[-1]
926 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000927
928
Richard Oudkerkad34ef82013-05-07 14:23:42 +0100929 __all__.extend(["spawnlp", "spawnlpe"])
930
Skip Montanaro269b83b2001-02-06 01:07:02 +0000931
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000932# Supply os.popen()
Antoine Pitrou877766d2011-03-19 17:00:37 +0100933def popen(cmd, mode="r", buffering=-1):
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000934 if not isinstance(cmd, str):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000935 raise TypeError("invalid cmd type (%s, expected string)" % type(cmd))
936 if mode not in ("r", "w"):
937 raise ValueError("invalid mode %r" % mode)
Benjamin Petersonb29614e2012-10-09 11:16:03 -0400938 if buffering == 0 or buffering is None:
Antoine Pitrou877766d2011-03-19 17:00:37 +0100939 raise ValueError("popen() does not support unbuffered streams")
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000940 import subprocess, io
941 if mode == "r":
942 proc = subprocess.Popen(cmd,
943 shell=True,
944 stdout=subprocess.PIPE,
945 bufsize=buffering)
946 return _wrap_close(io.TextIOWrapper(proc.stdout), proc)
947 else:
948 proc = subprocess.Popen(cmd,
949 shell=True,
950 stdin=subprocess.PIPE,
951 bufsize=buffering)
952 return _wrap_close(io.TextIOWrapper(proc.stdin), proc)
953
954# Helper for popen() -- a proxy for a file whose close waits for the process
955class _wrap_close:
956 def __init__(self, stream, proc):
957 self._stream = stream
958 self._proc = proc
959 def close(self):
960 self._stream.close()
Amaury Forgeot d'Arc97e5f282009-07-11 09:35:13 +0000961 returncode = self._proc.wait()
962 if returncode == 0:
963 return None
964 if name == 'nt':
965 return returncode
966 else:
967 return returncode << 8 # Shift left to match old behavior
Antoine Pitrouac625352009-12-09 00:01:27 +0000968 def __enter__(self):
969 return self
970 def __exit__(self, *args):
971 self.close()
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000972 def __getattr__(self, name):
973 return getattr(self._stream, name)
Thomas Heller476157b2007-09-04 11:27:47 +0000974 def __iter__(self):
975 return iter(self._stream)
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000976
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +0000977# Supply os.fdopen()
978def fdopen(fd, *args, **kwargs):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000979 if not isinstance(fd, int):
980 raise TypeError("invalid fd type (%s, expected integer)" % type(fd))
981 import io
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +0000982 return io.open(fd, *args, **kwargs)