blob: d1101a26a0d87929f392ff22b48e74008a13369c [file] [log] [blame]
Georg Brandlbde4ad42006-01-20 21:36:02 +00001r"""OS routines for Mac, NT, or Posix depending on what system we're on.
Guido van Rossum31104f41992-01-14 18:28:36 +00002
Guido van Rossum54f22ed2000-02-04 15:10:34 +00003This exports:
Alexandre Vassalottieca20b62008-05-16 02:54:33 +00004 - all functions from posix, nt, os2, or ce, e.g. unlink, stat, etc.
5 - os.path is either posixpath or ntpath
6 - os.name is either 'posix', 'nt', 'os2' or 'ce'.
Guido van Rossum54f22ed2000-02-04 15:10:34 +00007 - os.curdir is a string representing the current directory ('.' or ':')
8 - os.pardir is a string representing the parent directory ('..' or '::')
9 - os.sep is the (or a most common) pathname separator ('/' or ':' or '\\')
Georg Brandled5b9b32008-12-05 07:45:54 +000010 - os.extsep is the extension separator (always '.')
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +000011 - os.altsep is the alternate pathname separator (None or '/')
Guido van Rossum54f22ed2000-02-04 15:10:34 +000012 - os.pathsep is the component separator used in $PATH etc
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +000013 - os.linesep is the line separator in text files ('\r' or '\n' or '\r\n')
Guido van Rossum54f22ed2000-02-04 15:10:34 +000014 - os.defpath is the default search path for executables
Martin v. Löwisbdec50f2004-06-08 08:29:33 +000015 - os.devnull is the file path of the null device ('/dev/null', etc.)
Guido van Rossum31104f41992-01-14 18:28:36 +000016
Guido van Rossum54f22ed2000-02-04 15:10:34 +000017Programs that import and use 'os' stand a better chance of being
18portable between different platforms. Of course, they must then
19only use functions that are defined by all platforms (e.g., unlink
20and opendir), and leave all pathname manipulation to os.path
21(e.g., split and join).
22"""
Guido van Rossum31104f41992-01-14 18:28:36 +000023
Skip Montanaro269b83b2001-02-06 01:07:02 +000024#'
25
Christian Heimes45f9af32007-11-27 21:50:00 +000026import sys, errno
Guido van Rossuma28dab51997-08-29 22:36:47 +000027
28_names = sys.builtin_module_names
29
Tim Petersc4e09402003-04-25 07:11:48 +000030# Note: more names are added to __all__ later.
Brett Cannon13962fc2008-08-18 01:45:29 +000031__all__ = ["altsep", "curdir", "pardir", "sep", "pathsep", "linesep",
Martin v. Löwis22b457e2005-01-16 08:40:58 +000032 "defpath", "name", "path", "devnull",
33 "SEEK_SET", "SEEK_CUR", "SEEK_END"]
Skip Montanaro269b83b2001-02-06 01:07:02 +000034
35def _get_exports_list(module):
36 try:
37 return list(module.__all__)
38 except AttributeError:
39 return [n for n in dir(module) if n[0] != '_']
40
Guido van Rossuma28dab51997-08-29 22:36:47 +000041if 'posix' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000042 name = 'posix'
Guido van Rossume9387ea1998-05-22 15:26:04 +000043 linesep = '\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000044 from posix import *
45 try:
46 from posix import _exit
47 except ImportError:
48 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000049 import posixpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000050
Skip Montanaro269b83b2001-02-06 01:07:02 +000051 import posix
52 __all__.extend(_get_exports_list(posix))
53 del posix
54
Guido van Rossuma28dab51997-08-29 22:36:47 +000055elif 'nt' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000056 name = 'nt'
Guido van Rossume9387ea1998-05-22 15:26:04 +000057 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000058 from nt import *
Tim Peters6757c1e2003-01-08 21:20:57 +000059 try:
60 from nt import _exit
61 except ImportError:
62 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000063 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000064
Skip Montanaro269b83b2001-02-06 01:07:02 +000065 import nt
66 __all__.extend(_get_exports_list(nt))
67 del nt
68
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000069elif 'os2' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000070 name = 'os2'
Guido van Rossume9387ea1998-05-22 15:26:04 +000071 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000072 from os2 import *
73 try:
74 from os2 import _exit
75 except ImportError:
76 pass
Andrew MacIntyre5cef5712002-02-24 05:32:32 +000077 if sys.version.find('EMX GCC') == -1:
Skip Montanaro117910d2003-02-14 19:35:31 +000078 import ntpath as path
Andrew MacIntyre5cef5712002-02-24 05:32:32 +000079 else:
Skip Montanaro117910d2003-02-14 19:35:31 +000080 import os2emxpath as path
Andrew MacIntyre89f98652003-12-02 12:33:01 +000081 from _emx_link import link
Tim Petersf2715e02003-02-19 02:35:07 +000082
Skip Montanaro269b83b2001-02-06 01:07:02 +000083 import os2
84 __all__.extend(_get_exports_list(os2))
85 del os2
86
Guido van Rossum18df5d41999-06-11 01:37:27 +000087elif 'ce' in _names:
88 name = 'ce'
89 linesep = '\r\n'
Guido van Rossum18df5d41999-06-11 01:37:27 +000090 from ce import *
Tim Peters6757c1e2003-01-08 21:20:57 +000091 try:
92 from ce import _exit
93 except ImportError:
94 pass
Guido van Rossum18df5d41999-06-11 01:37:27 +000095 # We can use the standard Windows path.
Skip Montanaro117910d2003-02-14 19:35:31 +000096 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000097
Skip Montanaro269b83b2001-02-06 01:07:02 +000098 import ce
99 __all__.extend(_get_exports_list(ce))
100 del ce
101
Guido van Rossum2979b011994-08-01 11:18:30 +0000102else:
Collin Winter828f04a2007-08-31 00:04:24 +0000103 raise ImportError('no os specific module found')
Guido van Rossume65cce51993-11-08 15:05:21 +0000104
Skip Montanaro117910d2003-02-14 19:35:31 +0000105sys.modules['os.path'] = path
Georg Brandled5b9b32008-12-05 07:45:54 +0000106from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep,
107 devnull)
Skip Montanaro269b83b2001-02-06 01:07:02 +0000108
Guido van Rossuma28dab51997-08-29 22:36:47 +0000109del _names
110
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000111# Python uses fixed values for the SEEK_ constants; they are mapped
112# to native constants if necessary in posixmodule.c
113SEEK_SET = 0
114SEEK_CUR = 1
115SEEK_END = 2
116
Terry Reedy5a22b652010-12-02 07:05:56 +0000117
118def _get_masked_mode(mode):
119 mask = umask(0)
120 umask(mask)
121 return mode & ~mask
122
Skip Montanaro269b83b2001-02-06 01:07:02 +0000123#'
124
Guido van Rossum4def7de1998-07-24 20:48:03 +0000125# Super directory utilities.
126# (Inspired by Eric Raymond; the doc strings are mostly his)
127
Terry Reedy5a22b652010-12-02 07:05:56 +0000128def makedirs(name, mode=0o777, exist_ok=False):
129 """makedirs(path [, mode=0o777][, exist_ok=False])
Guido van Rossum4def7de1998-07-24 20:48:03 +0000130
131 Super-mkdir; create a leaf directory and all intermediate ones.
132 Works like mkdir, except that any intermediate path segment (not
Terry Reedy5a22b652010-12-02 07:05:56 +0000133 just the rightmost) will be created if it does not exist. If the
134 target directory with the same mode as we specified already exists,
135 raises an OSError if exist_ok is False, otherwise no exception is
136 raised. This is recursive.
Guido van Rossum4def7de1998-07-24 20:48:03 +0000137
138 """
139 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000140 if not tail:
141 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000142 if head and tail and not path.exists(head):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000143 try:
Terry Reedy5a22b652010-12-02 07:05:56 +0000144 makedirs(head, mode, exist_ok)
Guido van Rossumb940e112007-01-10 16:19:56 +0000145 except OSError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000146 # be happy if someone already created the path
Christian Heimes45f9af32007-11-27 21:50:00 +0000147 if e.errno != errno.EEXIST:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000148 raise
Andrew M. Kuchling6fccc8a2003-12-23 16:33:28 +0000149 if tail == curdir: # xxx/newdir/. exists if xxx/newdir exists
150 return
Terry Reedy5a22b652010-12-02 07:05:56 +0000151 try:
152 mkdir(name, mode)
153 except OSError as e:
154 import stat as st
Gregory P. Smitha81c8562012-06-03 14:30:44 -0700155 dir_exists = path.isdir(name)
156 expected_mode = _get_masked_mode(mode)
157 if dir_exists:
158 # S_ISGID is automatically copied by the OS from parent to child
159 # directories on mkdir. Don't consider it being set to be a mode
160 # mismatch as mkdir does not unset it when not specified in mode.
161 actual_mode = st.S_IMODE(lstat(name).st_mode) & ~st.S_ISGID
162 else:
163 actual_mode = -1
164 if not (e.errno == errno.EEXIST and exist_ok and dir_exists and
165 actual_mode == expected_mode):
Terry Reedy5a22b652010-12-02 07:05:56 +0000166 raise
Guido van Rossum4def7de1998-07-24 20:48:03 +0000167
168def removedirs(name):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000169 """removedirs(path)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000170
Fredrik Lundh96c1c7a2005-11-12 15:55:04 +0000171 Super-rmdir; remove a leaf directory and all empty intermediate
Guido van Rossum4def7de1998-07-24 20:48:03 +0000172 ones. Works like rmdir except that, if the leaf directory is
173 successfully removed, directories corresponding to rightmost path
Tim Petersc4e09402003-04-25 07:11:48 +0000174 segments will be pruned away until either the whole path is
Guido van Rossum4def7de1998-07-24 20:48:03 +0000175 consumed or an error occurs. Errors during this latter phase are
176 ignored -- they generally mean that a directory was not empty.
177
178 """
179 rmdir(name)
180 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000181 if not tail:
182 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000183 while head and tail:
184 try:
185 rmdir(head)
186 except error:
187 break
188 head, tail = path.split(head)
189
190def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000191 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000192
193 Super-rename; create directories as necessary and delete any left
194 empty. Works like rename, except creation of any intermediate
195 directories needed to make the new pathname good is attempted
196 first. After the rename, directories corresponding to rightmost
197 path segments of the old name will be pruned way until either the
198 whole path is consumed or a nonempty directory is found.
199
200 Note: this function can fail with the new directory structure made
201 if you lack permissions needed to unlink the leaf directory or
202 file.
203
204 """
205 head, tail = path.split(new)
206 if head and tail and not path.exists(head):
207 makedirs(head)
208 rename(old, new)
209 head, tail = path.split(old)
210 if head and tail:
211 try:
212 removedirs(head)
213 except error:
214 pass
215
Skip Montanaro269b83b2001-02-06 01:07:02 +0000216__all__.extend(["makedirs", "removedirs", "renames"])
217
Guido van Rossumd8faa362007-04-27 19:54:29 +0000218def walk(top, topdown=True, onerror=None, followlinks=False):
Tim Petersc4e09402003-04-25 07:11:48 +0000219 """Directory tree generator.
220
221 For each directory in the directory tree rooted at top (including top
222 itself, but excluding '.' and '..'), yields a 3-tuple
223
224 dirpath, dirnames, filenames
225
226 dirpath is a string, the path to the directory. dirnames is a list of
227 the names of the subdirectories in dirpath (excluding '.' and '..').
228 filenames is a list of the names of the non-directory files in dirpath.
229 Note that the names in the lists are just names, with no path components.
230 To get a full path (which begins with top) to a file or directory in
231 dirpath, do os.path.join(dirpath, name).
232
233 If optional arg 'topdown' is true or not specified, the triple for a
234 directory is generated before the triples for any of its subdirectories
235 (directories are generated top down). If topdown is false, the triple
236 for a directory is generated after the triples for all of its
237 subdirectories (directories are generated bottom up).
238
239 When topdown is true, the caller can modify the dirnames list in-place
240 (e.g., via del or slice assignment), and walk will only recurse into the
241 subdirectories whose names remain in dirnames; this can be used to prune
242 the search, or to impose a specific order of visiting. Modifying
243 dirnames when topdown is false is ineffective, since the directories in
244 dirnames have already been generated by the time dirnames itself is
245 generated.
246
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000247 By default errors from the os.listdir() call are ignored. If
248 optional arg 'onerror' is specified, it should be a function; it
249 will be called with one argument, an os.error instance. It can
250 report the error to continue with the walk, or raise the exception
251 to abort the walk. Note that the filename is available as the
252 filename attribute of the exception object.
253
Guido van Rossumd8faa362007-04-27 19:54:29 +0000254 By default, os.walk does not follow symbolic links to subdirectories on
255 systems that support them. In order to get this functionality, set the
256 optional argument 'followlinks' to true.
257
Tim Petersc4e09402003-04-25 07:11:48 +0000258 Caution: if you pass a relative pathname for top, don't change the
259 current working directory between resumptions of walk. walk never
260 changes the current directory, and assumes that the client doesn't
261 either.
262
263 Example:
264
Christian Heimes5d8da202008-05-06 13:58:24 +0000265 import os
Tim Petersc4e09402003-04-25 07:11:48 +0000266 from os.path import join, getsize
Christian Heimes5d8da202008-05-06 13:58:24 +0000267 for root, dirs, files in os.walk('python/Lib/email'):
Neal Norwitz752abd02008-05-13 04:55:24 +0000268 print(root, "consumes", end="")
269 print(sum([getsize(join(root, name)) for name in files]), end="")
270 print("bytes in", len(files), "non-directory files")
Tim Petersc4e09402003-04-25 07:11:48 +0000271 if 'CVS' in dirs:
272 dirs.remove('CVS') # don't visit CVS directories
273 """
274
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000275 islink, join, isdir = path.islink, path.join, path.isdir
Tim Petersc4e09402003-04-25 07:11:48 +0000276
277 # We may not have read permission for top, in which case we can't
Alexandre Vassalotti4e6531e2008-05-09 20:00:17 +0000278 # get a list of the files the directory contains. os.walk
Tim Petersc4e09402003-04-25 07:11:48 +0000279 # always suppressed the exception then, rather than blow up for a
280 # minor reason when (say) a thousand readable directories are still
281 # left to visit. That logic is copied here.
282 try:
283 # Note that listdir and error are globals in this module due
284 # to earlier import-*.
285 names = listdir(top)
Guido van Rossumb940e112007-01-10 16:19:56 +0000286 except error as err:
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000287 if onerror is not None:
288 onerror(err)
Tim Petersc4e09402003-04-25 07:11:48 +0000289 return
290
291 dirs, nondirs = [], []
292 for name in names:
293 if isdir(join(top, name)):
294 dirs.append(name)
295 else:
296 nondirs.append(name)
297
298 if topdown:
299 yield top, dirs, nondirs
300 for name in dirs:
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000301 new_path = join(top, name)
302 if followlinks or not islink(new_path):
303 for x in walk(new_path, topdown, onerror, followlinks):
Tim Petersc4e09402003-04-25 07:11:48 +0000304 yield x
305 if not topdown:
306 yield top, dirs, nondirs
307
308__all__.append("walk")
309
Guido van Rossuma28dab51997-08-29 22:36:47 +0000310# Make sure os.environ exists, at least
311try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000312 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000313except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000314 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000315
Guido van Rossume65cce51993-11-08 15:05:21 +0000316def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000317 """execl(file, *args)
318
319 Execute the executable file with argument list args, replacing the
320 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000321 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000322
323def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000324 """execle(file, *args, env)
325
326 Execute the executable file with argument list args and
327 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000328 env = args[-1]
329 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000330
331def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000332 """execlp(file, *args)
333
334 Execute the executable file (which is searched for along $PATH)
335 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000336 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000337
Guido van Rossum030afb11995-03-14 17:27:18 +0000338def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000339 """execlpe(file, *args, env)
340
341 Execute the executable file (which is searched for along $PATH)
342 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000343 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000344 env = args[-1]
345 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000346
Guido van Rossume65cce51993-11-08 15:05:21 +0000347def execvp(file, args):
Matthias Klosea09c54f2010-01-31 16:48:44 +0000348 """execvp(file, args)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000349
350 Execute the executable file (which is searched for along $PATH)
351 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000352 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000353 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000354
355def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000356 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000357
358 Execute the executable file (which is searched for along $PATH)
359 with argument list args and environment env , replacing the
360 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000361 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000362 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000363
Skip Montanaro269b83b2001-02-06 01:07:02 +0000364__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
365
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000366def _execvpe(file, args, env=None):
367 if env is not None:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000368 exec_func = execve
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000369 argrest = (args, env)
370 else:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000371 exec_func = execv
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000372 argrest = (args,)
373 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000374
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000375 head, tail = path.split(file)
376 if head:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000377 exec_func(file, *argrest)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000378 return
Guido van Rossume7ba4952007-06-06 23:52:48 +0000379 last_exc = saved_exc = None
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000380 saved_tb = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000381 path_list = get_exec_path(env)
382 if name != 'nt':
383 file = fsencode(file)
384 path_list = map(fsencode, path_list)
385 for dir in path_list:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000386 fullname = path.join(dir, file)
387 try:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000388 exec_func(fullname, *argrest)
Guido van Rossumb940e112007-01-10 16:19:56 +0000389 except error as e:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000390 last_exc = e
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000391 tb = sys.exc_info()[2]
Christian Heimes45f9af32007-11-27 21:50:00 +0000392 if (e.errno != errno.ENOENT and e.errno != errno.ENOTDIR
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000393 and saved_exc is None):
394 saved_exc = e
395 saved_tb = tb
396 if saved_exc:
Benjamin Peterson4b068192009-02-20 03:19:25 +0000397 raise saved_exc.with_traceback(saved_tb)
398 raise last_exc.with_traceback(tb)
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000399
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000400
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000401def get_exec_path(env=None):
402 """Returns the sequence of directories that will be searched for the
403 named executable (similar to a shell) when launching a process.
404
405 *env* must be an environment variable dict or None. If *env* is None,
406 os.environ will be used.
407 """
Victor Stinner273b7662010-11-06 12:59:33 +0000408 # Use a local import instead of a global import to limit the number of
409 # modules loaded at startup: the os module is always loaded at startup by
410 # Python. It may also avoid a bootstrap issue.
Victor Stinner6f35eda2010-10-29 00:38:58 +0000411 import warnings
412
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000413 if env is None:
414 env = environ
Victor Stinnerb745a742010-05-18 17:17:23 +0000415
Victor Stinnerbb4f2182010-11-07 15:43:39 +0000416 # {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a
417 # BytesWarning when using python -b or python -bb: ignore the warning
Victor Stinner273b7662010-11-06 12:59:33 +0000418 with warnings.catch_warnings():
419 warnings.simplefilter("ignore", BytesWarning)
Victor Stinnerb745a742010-05-18 17:17:23 +0000420
Victor Stinnerb745a742010-05-18 17:17:23 +0000421 try:
Victor Stinner273b7662010-11-06 12:59:33 +0000422 path_list = env.get('PATH')
423 except TypeError:
424 path_list = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000425
Victor Stinner273b7662010-11-06 12:59:33 +0000426 if supports_bytes_environ:
427 try:
428 path_listb = env[b'PATH']
429 except (KeyError, TypeError):
430 pass
431 else:
432 if path_list is not None:
433 raise ValueError(
434 "env cannot contain 'PATH' and b'PATH' keys")
435 path_list = path_listb
436
437 if path_list is not None and isinstance(path_list, bytes):
438 path_list = fsdecode(path_list)
Victor Stinnerb745a742010-05-18 17:17:23 +0000439
440 if path_list is None:
441 path_list = defpath
442 return path_list.split(pathsep)
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000443
444
Skip Montanaro289bc052007-08-17 02:30:27 +0000445# Change environ to automatically call putenv(), unsetenv if they exist.
446from _abcoll import MutableMapping # Can't use collections (bootstrap)
447
448class _Environ(MutableMapping):
Victor Stinner84ae1182010-05-06 22:05:07 +0000449 def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv):
450 self.encodekey = encodekey
451 self.decodekey = decodekey
452 self.encodevalue = encodevalue
453 self.decodevalue = decodevalue
Skip Montanaro289bc052007-08-17 02:30:27 +0000454 self.putenv = putenv
455 self.unsetenv = unsetenv
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000456 self._data = data
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000457
Skip Montanaro289bc052007-08-17 02:30:27 +0000458 def __getitem__(self, key):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000459 value = self._data[self.encodekey(key)]
Victor Stinner84ae1182010-05-06 22:05:07 +0000460 return self.decodevalue(value)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000461
Skip Montanaro289bc052007-08-17 02:30:27 +0000462 def __setitem__(self, key, value):
Victor Stinner84ae1182010-05-06 22:05:07 +0000463 key = self.encodekey(key)
464 value = self.encodevalue(value)
Skip Montanaro289bc052007-08-17 02:30:27 +0000465 self.putenv(key, value)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000466 self._data[key] = value
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000467
Skip Montanaro289bc052007-08-17 02:30:27 +0000468 def __delitem__(self, key):
Victor Stinner84ae1182010-05-06 22:05:07 +0000469 key = self.encodekey(key)
Skip Montanaro289bc052007-08-17 02:30:27 +0000470 self.unsetenv(key)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000471 del self._data[key]
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000472
Skip Montanaro289bc052007-08-17 02:30:27 +0000473 def __iter__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000474 for key in self._data:
Victor Stinner84ae1182010-05-06 22:05:07 +0000475 yield self.decodekey(key)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000476
Skip Montanaro289bc052007-08-17 02:30:27 +0000477 def __len__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000478 return len(self._data)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000479
480 def __repr__(self):
Victor Stinnerbed71172010-07-28 21:25:42 +0000481 return 'environ({{{}}})'.format(', '.join(
Victor Stinnerd73c1a32010-07-28 21:23:23 +0000482 ('{!r}: {!r}'.format(self.decodekey(key), self.decodevalue(value))
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000483 for key, value in self._data.items())))
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000484
Skip Montanaro289bc052007-08-17 02:30:27 +0000485 def copy(self):
486 return dict(self)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000487
Skip Montanaro289bc052007-08-17 02:30:27 +0000488 def setdefault(self, key, value):
489 if key not in self:
490 self[key] = value
491 return self[key]
492
493try:
494 _putenv = putenv
495except NameError:
496 _putenv = lambda key, value: None
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000497else:
Skip Montanaro289bc052007-08-17 02:30:27 +0000498 __all__.append("putenv")
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000499
Skip Montanaro289bc052007-08-17 02:30:27 +0000500try:
501 _unsetenv = unsetenv
502except NameError:
503 _unsetenv = lambda key: _putenv(key, "")
504else:
505 __all__.append("unsetenv")
Guido van Rossumc524d952001-10-19 01:31:59 +0000506
Victor Stinner84ae1182010-05-06 22:05:07 +0000507def _createenviron():
508 if name in ('os2', 'nt'):
509 # Where Env Var Names Must Be UPPERCASE
510 def check_str(value):
511 if not isinstance(value, str):
512 raise TypeError("str expected, not %s" % type(value).__name__)
513 return value
514 encode = check_str
515 decode = str
516 def encodekey(key):
517 return encode(key).upper()
518 data = {}
519 for key, value in environ.items():
520 data[encodekey(key)] = value
521 else:
522 # Where Env Var Names Can Be Mixed Case
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000523 encoding = sys.getfilesystemencoding()
Victor Stinner84ae1182010-05-06 22:05:07 +0000524 def encode(value):
525 if not isinstance(value, str):
526 raise TypeError("str expected, not %s" % type(value).__name__)
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000527 return value.encode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000528 def decode(value):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000529 return value.decode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000530 encodekey = encode
531 data = environ
532 return _Environ(data,
533 encodekey, decode,
534 encode, decode,
535 _putenv, _unsetenv)
Guido van Rossumc524d952001-10-19 01:31:59 +0000536
Victor Stinner84ae1182010-05-06 22:05:07 +0000537# unicode environ
538environ = _createenviron()
539del _createenviron
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000540
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000541
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000542def getenv(key, default=None):
Tim Peters2c60f7a2003-01-29 03:49:43 +0000543 """Get an environment variable, return None if it doesn't exist.
Victor Stinner84ae1182010-05-06 22:05:07 +0000544 The optional second argument can specify an alternate default.
545 key, default and the result are str."""
Tim Peters2c60f7a2003-01-29 03:49:43 +0000546 return environ.get(key, default)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000547
Victor Stinnerb745a742010-05-18 17:17:23 +0000548supports_bytes_environ = name not in ('os2', 'nt')
549__all__.extend(("getenv", "supports_bytes_environ"))
550
551if supports_bytes_environ:
Victor Stinner84ae1182010-05-06 22:05:07 +0000552 def _check_bytes(value):
553 if not isinstance(value, bytes):
554 raise TypeError("bytes expected, not %s" % type(value).__name__)
555 return value
556
557 # bytes environ
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000558 environb = _Environ(environ._data,
Victor Stinner84ae1182010-05-06 22:05:07 +0000559 _check_bytes, bytes,
560 _check_bytes, bytes,
561 _putenv, _unsetenv)
562 del _check_bytes
563
564 def getenvb(key, default=None):
565 """Get an environment variable, return None if it doesn't exist.
566 The optional second argument can specify an alternate default.
567 key, default and the result are bytes."""
568 return environb.get(key, default)
Victor Stinner70120e22010-07-29 17:19:38 +0000569
570 __all__.extend(("environb", "getenvb"))
Victor Stinner84ae1182010-05-06 22:05:07 +0000571
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000572def _fscodec():
573 encoding = sys.getfilesystemencoding()
574 if encoding == 'mbcs':
Victor Stinnere882aac2010-10-24 21:12:26 +0000575 errors = 'strict'
Victor Stinner313a1202010-06-11 23:56:51 +0000576 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000577 errors = 'surrogateescape'
Victor Stinnere8d51452010-08-19 01:05:19 +0000578
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000579 def fsencode(filename):
580 """
581 Encode filename to the filesystem encoding with 'surrogateescape' error
582 handler, return bytes unchanged. On Windows, use 'strict' error handler if
583 the file system encoding is 'mbcs' (which is the default encoding).
584 """
585 if isinstance(filename, bytes):
586 return filename
587 elif isinstance(filename, str):
588 return filename.encode(encoding, errors)
Victor Stinnere8d51452010-08-19 01:05:19 +0000589 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000590 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
591
592 def fsdecode(filename):
593 """
594 Decode filename from the filesystem encoding with 'surrogateescape' error
595 handler, return str unchanged. On Windows, use 'strict' error handler if
596 the file system encoding is 'mbcs' (which is the default encoding).
597 """
598 if isinstance(filename, str):
599 return filename
600 elif isinstance(filename, bytes):
601 return filename.decode(encoding, errors)
602 else:
603 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
604
605 return fsencode, fsdecode
606
607fsencode, fsdecode = _fscodec()
608del _fscodec
Victor Stinner449c4662010-05-08 11:10:09 +0000609
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000610def _exists(name):
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000611 return name in globals()
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000612
613# Supply spawn*() (probably only for Unix)
614if _exists("fork") and not _exists("spawnv") and _exists("execv"):
615
616 P_WAIT = 0
617 P_NOWAIT = P_NOWAITO = 1
618
619 # XXX Should we support P_DETACH? I suppose it could fork()**2
620 # and close the std I/O streams. Also, P_OVERLAY is the same
621 # as execv*()?
622
623 def _spawnvef(mode, file, args, env, func):
624 # Internal helper; func is the exec*() function to use
625 pid = fork()
626 if not pid:
627 # Child
628 try:
629 if env is None:
630 func(file, args)
631 else:
632 func(file, args, env)
633 except:
634 _exit(127)
635 else:
636 # Parent
637 if mode == P_NOWAIT:
638 return pid # Caller is responsible for waiting!
639 while 1:
640 wpid, sts = waitpid(pid, 0)
641 if WIFSTOPPED(sts):
642 continue
643 elif WIFSIGNALED(sts):
644 return -WTERMSIG(sts)
645 elif WIFEXITED(sts):
646 return WEXITSTATUS(sts)
647 else:
Collin Winter828f04a2007-08-31 00:04:24 +0000648 raise error("Not stopped, signaled or exited???")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000649
650 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000651 """spawnv(mode, file, args) -> integer
652
653Execute file with arguments from args in a subprocess.
654If mode == P_NOWAIT return the pid of the process.
655If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000656otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000657 return _spawnvef(mode, file, args, None, execv)
658
659 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000660 """spawnve(mode, file, args, env) -> integer
661
662Execute file with arguments from args in a subprocess with the
663specified environment.
664If mode == P_NOWAIT return the pid of the process.
665If mode == P_WAIT return the process's exit code if it exits normally;
666otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000667 return _spawnvef(mode, file, args, env, execve)
668
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000669 # Note: spawnvp[e] is't currently supported on Windows
670
671 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000672 """spawnvp(mode, file, args) -> integer
673
674Execute file (which is looked for along $PATH) with arguments from
675args in a subprocess.
676If mode == P_NOWAIT return the pid of the process.
677If mode == P_WAIT return the process's exit code if it exits normally;
678otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000679 return _spawnvef(mode, file, args, None, execvp)
680
681 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000682 """spawnvpe(mode, file, args, env) -> integer
683
684Execute file (which is looked for along $PATH) with arguments from
685args in a subprocess with the supplied environment.
686If mode == P_NOWAIT return the pid of the process.
687If mode == P_WAIT return the process's exit code if it exits normally;
688otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000689 return _spawnvef(mode, file, args, env, execvpe)
690
691if _exists("spawnv"):
692 # These aren't supplied by the basic Windows code
693 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000694
695 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000696 """spawnl(mode, file, *args) -> integer
697
698Execute file with arguments from args in a subprocess.
699If mode == P_NOWAIT return the pid of the process.
700If mode == P_WAIT return the process's exit code if it exits normally;
701otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000702 return spawnv(mode, file, args)
703
704 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000705 """spawnle(mode, file, *args, env) -> integer
706
707Execute file with arguments from args in a subprocess with the
708supplied environment.
709If mode == P_NOWAIT return the pid of the process.
710If mode == P_WAIT return the process's exit code if it exits normally;
711otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000712 env = args[-1]
713 return spawnve(mode, file, args[:-1], env)
714
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000715
716 __all__.extend(["spawnv", "spawnve", "spawnl", "spawnle",])
717
718
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000719if _exists("spawnvp"):
720 # At the moment, Windows doesn't implement spawnvp[e],
721 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000722 def spawnlp(mode, file, *args):
Neal Norwitzb7f68102003-07-02 02:49:33 +0000723 """spawnlp(mode, file, *args) -> integer
Guido van Rossume0cd2912000-04-21 18:35:36 +0000724
725Execute file (which is looked for along $PATH) with arguments from
726args in a subprocess with the supplied environment.
727If mode == P_NOWAIT return the pid of the process.
728If mode == P_WAIT return the process's exit code if it exits normally;
729otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000730 return spawnvp(mode, file, args)
731
732 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000733 """spawnlpe(mode, file, *args, env) -> integer
734
735Execute file (which is looked for along $PATH) with arguments from
736args in a subprocess with the supplied environment.
737If mode == P_NOWAIT return the pid of the process.
738If mode == P_WAIT return the process's exit code if it exits normally;
739otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000740 env = args[-1]
741 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000742
743
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000744 __all__.extend(["spawnvp", "spawnvpe", "spawnlp", "spawnlpe",])
Skip Montanaro269b83b2001-02-06 01:07:02 +0000745
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000746import copyreg as _copyreg
Michael W. Hudson0e025302002-03-06 17:11:18 +0000747
748def _make_stat_result(tup, dict):
749 return stat_result(tup, dict)
750
751def _pickle_stat_result(sr):
752 (type, args) = sr.__reduce__()
753 return (_make_stat_result, args)
754
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000755try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000756 _copyreg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000757except NameError: # stat_result may not exist
758 pass
Michael W. Hudson0e025302002-03-06 17:11:18 +0000759
760def _make_statvfs_result(tup, dict):
761 return statvfs_result(tup, dict)
762
763def _pickle_statvfs_result(sr):
764 (type, args) = sr.__reduce__()
765 return (_make_statvfs_result, args)
766
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000767try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000768 _copyreg.pickle(statvfs_result, _pickle_statvfs_result,
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000769 _make_statvfs_result)
Michael W. Hudsone5363b72002-03-15 10:21:59 +0000770except NameError: # statvfs_result may not exist
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000771 pass
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000772
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000773# Supply os.popen()
Antoine Pitrou877766d2011-03-19 17:00:37 +0100774def popen(cmd, mode="r", buffering=-1):
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000775 if not isinstance(cmd, str):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000776 raise TypeError("invalid cmd type (%s, expected string)" % type(cmd))
777 if mode not in ("r", "w"):
778 raise ValueError("invalid mode %r" % mode)
Antoine Pitrou877766d2011-03-19 17:00:37 +0100779 if buffering == 0 or buffering == None:
780 raise ValueError("popen() does not support unbuffered streams")
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000781 import subprocess, io
782 if mode == "r":
783 proc = subprocess.Popen(cmd,
784 shell=True,
785 stdout=subprocess.PIPE,
786 bufsize=buffering)
787 return _wrap_close(io.TextIOWrapper(proc.stdout), proc)
788 else:
789 proc = subprocess.Popen(cmd,
790 shell=True,
791 stdin=subprocess.PIPE,
792 bufsize=buffering)
793 return _wrap_close(io.TextIOWrapper(proc.stdin), proc)
794
795# Helper for popen() -- a proxy for a file whose close waits for the process
796class _wrap_close:
797 def __init__(self, stream, proc):
798 self._stream = stream
799 self._proc = proc
800 def close(self):
801 self._stream.close()
Amaury Forgeot d'Arc97e5f282009-07-11 09:35:13 +0000802 returncode = self._proc.wait()
803 if returncode == 0:
804 return None
805 if name == 'nt':
806 return returncode
807 else:
808 return returncode << 8 # Shift left to match old behavior
Antoine Pitrouac625352009-12-09 00:01:27 +0000809 def __enter__(self):
810 return self
811 def __exit__(self, *args):
812 self.close()
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000813 def __getattr__(self, name):
814 return getattr(self._stream, name)
Thomas Heller476157b2007-09-04 11:27:47 +0000815 def __iter__(self):
816 return iter(self._stream)
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000817
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +0000818# Supply os.fdopen()
819def fdopen(fd, *args, **kwargs):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000820 if not isinstance(fd, int):
821 raise TypeError("invalid fd type (%s, expected integer)" % type(fd))
822 import io
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +0000823 return io.open(fd, *args, **kwargs)