blob: 34cbdc9311a9606b5c8612c16d1c76afb6f2a428 [file] [log] [blame]
Georg Brandlbde4ad42006-01-20 21:36:021r"""OS routines for Mac, NT, or Posix depending on what system we're on.
Guido van Rossum31104f41992-01-14 18:28:362
Guido van Rossum54f22ed2000-02-04 15:10:343This exports:
Alexandre Vassalottieca20b62008-05-16 02:54:334 - 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:347 - 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:5410 - os.extsep is the extension separator (always '.')
Guido van Rossum4b8c6ea2000-02-04 15:39:3011 - os.altsep is the alternate pathname separator (None or '/')
Guido van Rossum54f22ed2000-02-04 15:10:3412 - os.pathsep is the component separator used in $PATH etc
Guido van Rossum4b8c6ea2000-02-04 15:39:3013 - os.linesep is the line separator in text files ('\r' or '\n' or '\r\n')
Guido van Rossum54f22ed2000-02-04 15:10:3414 - os.defpath is the default search path for executables
Martin v. Löwisbdec50f2004-06-08 08:29:3315 - os.devnull is the file path of the null device ('/dev/null', etc.)
Guido van Rossum31104f41992-01-14 18:28:3616
Guido van Rossum54f22ed2000-02-04 15:10:3417Programs 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:3623
Skip Montanaro269b83b2001-02-06 01:07:0224#'
25
Christian Heimes45f9af32007-11-27 21:50:0026import sys, errno
Guido van Rossuma28dab51997-08-29 22:36:4727
28_names = sys.builtin_module_names
29
Tim Petersc4e09402003-04-25 07:11:4830# Note: more names are added to __all__ later.
Brett Cannon13962fc2008-08-18 01:45:2931__all__ = ["altsep", "curdir", "pardir", "sep", "pathsep", "linesep",
Martin v. Löwis22b457e2005-01-16 08:40:5832 "defpath", "name", "path", "devnull",
33 "SEEK_SET", "SEEK_CUR", "SEEK_END"]
Skip Montanaro269b83b2001-02-06 01:07:0234
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:4741if 'posix' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:3042 name = 'posix'
Guido van Rossume9387ea1998-05-22 15:26:0443 linesep = '\n'
Guido van Rossum61de0ac1997-12-05 21:24:3044 from posix import *
45 try:
46 from posix import _exit
47 except ImportError:
48 pass
Skip Montanaro117910d2003-02-14 19:35:3149 import posixpath as path
Tim Petersf2715e02003-02-19 02:35:0750
Skip Montanaro269b83b2001-02-06 01:07:0251 import posix
52 __all__.extend(_get_exports_list(posix))
53 del posix
54
Guido van Rossuma28dab51997-08-29 22:36:4755elif 'nt' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:3056 name = 'nt'
Guido van Rossume9387ea1998-05-22 15:26:0457 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:3058 from nt import *
Tim Peters6757c1e2003-01-08 21:20:5759 try:
60 from nt import _exit
61 except ImportError:
62 pass
Skip Montanaro117910d2003-02-14 19:35:3163 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:0764
Skip Montanaro269b83b2001-02-06 01:07:0265 import nt
66 __all__.extend(_get_exports_list(nt))
67 del nt
68
Guido van Rossum8e9ebfd1997-11-22 21:53:4869elif 'os2' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:3070 name = 'os2'
Guido van Rossume9387ea1998-05-22 15:26:0471 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:3072 from os2 import *
73 try:
74 from os2 import _exit
75 except ImportError:
76 pass
Andrew MacIntyre5cef5712002-02-24 05:32:3277 if sys.version.find('EMX GCC') == -1:
Skip Montanaro117910d2003-02-14 19:35:3178 import ntpath as path
Andrew MacIntyre5cef5712002-02-24 05:32:3279 else:
Skip Montanaro117910d2003-02-14 19:35:3180 import os2emxpath as path
Andrew MacIntyre89f98652003-12-02 12:33:0181 from _emx_link import link
Tim Petersf2715e02003-02-19 02:35:0782
Skip Montanaro269b83b2001-02-06 01:07:0283 import os2
84 __all__.extend(_get_exports_list(os2))
85 del os2
86
Guido van Rossum18df5d41999-06-11 01:37:2787elif 'ce' in _names:
88 name = 'ce'
89 linesep = '\r\n'
Guido van Rossum18df5d41999-06-11 01:37:2790 from ce import *
Tim Peters6757c1e2003-01-08 21:20:5791 try:
92 from ce import _exit
93 except ImportError:
94 pass
Guido van Rossum18df5d41999-06-11 01:37:2795 # We can use the standard Windows path.
Skip Montanaro117910d2003-02-14 19:35:3196 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:0797
Skip Montanaro269b83b2001-02-06 01:07:0298 import ce
99 __all__.extend(_get_exports_list(ce))
100 del ce
101
Guido van Rossum2979b011994-08-01 11:18:30102else:
Collin Winter828f04a2007-08-31 00:04:24103 raise ImportError('no os specific module found')
Guido van Rossume65cce51993-11-08 15:05:21104
Skip Montanaro117910d2003-02-14 19:35:31105sys.modules['os.path'] = path
Georg Brandled5b9b32008-12-05 07:45:54106from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep,
107 devnull)
Skip Montanaro269b83b2001-02-06 01:07:02108
Guido van Rossuma28dab51997-08-29 22:36:47109del _names
110
Martin v. Löwis22b457e2005-01-16 08:40:58111# 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
Skip Montanaro269b83b2001-02-06 01:07:02117#'
118
Guido van Rossum4def7de1998-07-24 20:48:03119# Super directory utilities.
120# (Inspired by Eric Raymond; the doc strings are mostly his)
121
Terry Reedy5a22b652010-12-02 07:05:56122def makedirs(name, mode=0o777, exist_ok=False):
123 """makedirs(path [, mode=0o777][, exist_ok=False])
Guido van Rossum4def7de1998-07-24 20:48:03124
Benjamin Petersonee5f1c12014-04-01 23:13:18125 Super-mkdir; create a leaf directory and all intermediate ones. Works like
126 mkdir, except that any intermediate path segment (not just the rightmost)
127 will be created if it does not exist. If the target directory already
128 exists, raise an OSError if exist_ok is False. Otherwise no exception is
Terry Reedy5a22b652010-12-02 07:05:56129 raised. This is recursive.
Guido van Rossum4def7de1998-07-24 20:48:03130
131 """
132 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40133 if not tail:
134 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03135 if head and tail and not path.exists(head):
Thomas Wouters89f507f2006-12-13 04:49:30136 try:
Terry Reedy5a22b652010-12-02 07:05:56137 makedirs(head, mode, exist_ok)
Guido van Rossumb940e112007-01-10 16:19:56138 except OSError as e:
Thomas Wouters89f507f2006-12-13 04:49:30139 # be happy if someone already created the path
Christian Heimes45f9af32007-11-27 21:50:00140 if e.errno != errno.EEXIST:
Thomas Wouters89f507f2006-12-13 04:49:30141 raise
Serhiy Storchaka4ab23bf2013-01-08 09:32:58142 cdir = curdir
143 if isinstance(tail, bytes):
144 cdir = bytes(curdir, 'ASCII')
145 if tail == cdir: # xxx/newdir/. exists if xxx/newdir exists
Andrew M. Kuchling6fccc8a2003-12-23 16:33:28146 return
Terry Reedy5a22b652010-12-02 07:05:56147 try:
148 mkdir(name, mode)
149 except OSError as e:
Benjamin Petersonee5f1c12014-04-01 23:13:18150 if not exist_ok or e.errno != errno.EEXIST or not path.isdir(name):
Terry Reedy5a22b652010-12-02 07:05:56151 raise
Guido van Rossum4def7de1998-07-24 20:48:03152
153def removedirs(name):
Fred Drakecadb9eb2002-07-02 21:28:04154 """removedirs(path)
Guido van Rossum4def7de1998-07-24 20:48:03155
Fredrik Lundh96c1c7a2005-11-12 15:55:04156 Super-rmdir; remove a leaf directory and all empty intermediate
Guido van Rossum4def7de1998-07-24 20:48:03157 ones. Works like rmdir except that, if the leaf directory is
158 successfully removed, directories corresponding to rightmost path
Tim Petersc4e09402003-04-25 07:11:48159 segments will be pruned away until either the whole path is
Guido van Rossum4def7de1998-07-24 20:48:03160 consumed or an error occurs. Errors during this latter phase are
161 ignored -- they generally mean that a directory was not empty.
162
163 """
164 rmdir(name)
165 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40166 if not tail:
167 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03168 while head and tail:
169 try:
170 rmdir(head)
171 except error:
172 break
173 head, tail = path.split(head)
174
175def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04176 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03177
178 Super-rename; create directories as necessary and delete any left
179 empty. Works like rename, except creation of any intermediate
180 directories needed to make the new pathname good is attempted
181 first. After the rename, directories corresponding to rightmost
182 path segments of the old name will be pruned way until either the
183 whole path is consumed or a nonempty directory is found.
184
185 Note: this function can fail with the new directory structure made
186 if you lack permissions needed to unlink the leaf directory or
187 file.
188
189 """
190 head, tail = path.split(new)
191 if head and tail and not path.exists(head):
192 makedirs(head)
193 rename(old, new)
194 head, tail = path.split(old)
195 if head and tail:
196 try:
197 removedirs(head)
198 except error:
199 pass
200
Skip Montanaro269b83b2001-02-06 01:07:02201__all__.extend(["makedirs", "removedirs", "renames"])
202
Guido van Rossumd8faa362007-04-27 19:54:29203def walk(top, topdown=True, onerror=None, followlinks=False):
Tim Petersc4e09402003-04-25 07:11:48204 """Directory tree generator.
205
206 For each directory in the directory tree rooted at top (including top
207 itself, but excluding '.' and '..'), yields a 3-tuple
208
209 dirpath, dirnames, filenames
210
211 dirpath is a string, the path to the directory. dirnames is a list of
212 the names of the subdirectories in dirpath (excluding '.' and '..').
213 filenames is a list of the names of the non-directory files in dirpath.
214 Note that the names in the lists are just names, with no path components.
215 To get a full path (which begins with top) to a file or directory in
216 dirpath, do os.path.join(dirpath, name).
217
218 If optional arg 'topdown' is true or not specified, the triple for a
219 directory is generated before the triples for any of its subdirectories
220 (directories are generated top down). If topdown is false, the triple
221 for a directory is generated after the triples for all of its
222 subdirectories (directories are generated bottom up).
223
224 When topdown is true, the caller can modify the dirnames list in-place
225 (e.g., via del or slice assignment), and walk will only recurse into the
226 subdirectories whose names remain in dirnames; this can be used to prune
227 the search, or to impose a specific order of visiting. Modifying
228 dirnames when topdown is false is ineffective, since the directories in
229 dirnames have already been generated by the time dirnames itself is
230 generated.
231
Guido van Rossumbf1bef82003-05-13 18:01:19232 By default errors from the os.listdir() call are ignored. If
233 optional arg 'onerror' is specified, it should be a function; it
234 will be called with one argument, an os.error instance. It can
235 report the error to continue with the walk, or raise the exception
236 to abort the walk. Note that the filename is available as the
237 filename attribute of the exception object.
238
Guido van Rossumd8faa362007-04-27 19:54:29239 By default, os.walk does not follow symbolic links to subdirectories on
240 systems that support them. In order to get this functionality, set the
241 optional argument 'followlinks' to true.
242
Tim Petersc4e09402003-04-25 07:11:48243 Caution: if you pass a relative pathname for top, don't change the
244 current working directory between resumptions of walk. walk never
245 changes the current directory, and assumes that the client doesn't
246 either.
247
248 Example:
249
Christian Heimes5d8da202008-05-06 13:58:24250 import os
Tim Petersc4e09402003-04-25 07:11:48251 from os.path import join, getsize
Christian Heimes5d8da202008-05-06 13:58:24252 for root, dirs, files in os.walk('python/Lib/email'):
Neal Norwitz752abd02008-05-13 04:55:24253 print(root, "consumes", end="")
254 print(sum([getsize(join(root, name)) for name in files]), end="")
255 print("bytes in", len(files), "non-directory files")
Tim Petersc4e09402003-04-25 07:11:48256 if 'CVS' in dirs:
257 dirs.remove('CVS') # don't visit CVS directories
258 """
259
Benjamin Petersonf6489f92009-11-25 17:46:26260 islink, join, isdir = path.islink, path.join, path.isdir
Tim Petersc4e09402003-04-25 07:11:48261
262 # We may not have read permission for top, in which case we can't
Alexandre Vassalotti4e6531e2008-05-09 20:00:17263 # get a list of the files the directory contains. os.walk
Tim Petersc4e09402003-04-25 07:11:48264 # always suppressed the exception then, rather than blow up for a
265 # minor reason when (say) a thousand readable directories are still
266 # left to visit. That logic is copied here.
267 try:
268 # Note that listdir and error are globals in this module due
269 # to earlier import-*.
270 names = listdir(top)
Guido van Rossumb940e112007-01-10 16:19:56271 except error as err:
Guido van Rossumbf1bef82003-05-13 18:01:19272 if onerror is not None:
273 onerror(err)
Tim Petersc4e09402003-04-25 07:11:48274 return
275
276 dirs, nondirs = [], []
277 for name in names:
278 if isdir(join(top, name)):
279 dirs.append(name)
280 else:
281 nondirs.append(name)
282
283 if topdown:
284 yield top, dirs, nondirs
285 for name in dirs:
Benjamin Petersonf6489f92009-11-25 17:46:26286 new_path = join(top, name)
287 if followlinks or not islink(new_path):
288 for x in walk(new_path, topdown, onerror, followlinks):
Tim Petersc4e09402003-04-25 07:11:48289 yield x
290 if not topdown:
291 yield top, dirs, nondirs
292
293__all__.append("walk")
294
Guido van Rossuma28dab51997-08-29 22:36:47295# Make sure os.environ exists, at least
296try:
Guido van Rossum61de0ac1997-12-05 21:24:30297 environ
Guido van Rossuma28dab51997-08-29 22:36:47298except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30299 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47300
Guido van Rossume65cce51993-11-08 15:05:21301def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22302 """execl(file, *args)
303
304 Execute the executable file with argument list args, replacing the
305 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30306 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21307
308def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22309 """execle(file, *args, env)
310
311 Execute the executable file with argument list args and
312 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30313 env = args[-1]
314 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21315
316def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22317 """execlp(file, *args)
318
319 Execute the executable file (which is searched for along $PATH)
320 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30321 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21322
Guido van Rossum030afb11995-03-14 17:27:18323def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22324 """execlpe(file, *args, env)
325
326 Execute the executable file (which is searched for along $PATH)
327 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52328 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30329 env = args[-1]
330 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18331
Guido van Rossume65cce51993-11-08 15:05:21332def execvp(file, args):
Matthias Klosea09c54f2010-01-31 16:48:44333 """execvp(file, args)
Guido van Rossum7da3cc52000-04-25 10:53:22334
335 Execute the executable file (which is searched for along $PATH)
336 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32337 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30338 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18339
340def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17341 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22342
343 Execute the executable file (which is searched for along $PATH)
344 with argument list args and environment env , replacing the
345 current process.
Tim Peters2344fae2001-01-15 00:50:52346 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30347 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18348
Skip Montanaro269b83b2001-02-06 01:07:02349__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
350
Guido van Rossum5a2ca931999-11-02 13:27:32351def _execvpe(file, args, env=None):
Guido van Rossum5a2ca931999-11-02 13:27:32352 if env is not None:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22353 exec_func = execve
Guido van Rossum61de0ac1997-12-05 21:24:30354 argrest = (args, env)
355 else:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22356 exec_func = execv
Guido van Rossum61de0ac1997-12-05 21:24:30357 argrest = (args,)
358 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24359
Guido van Rossum61de0ac1997-12-05 21:24:30360 head, tail = path.split(file)
361 if head:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22362 exec_func(file, *argrest)
Guido van Rossum61de0ac1997-12-05 21:24:30363 return
Guido van Rossume7ba4952007-06-06 23:52:48364 last_exc = saved_exc = None
Guido van Rossum683c0fe2002-09-03 16:36:17365 saved_tb = None
Victor Stinnerb745a742010-05-18 17:17:23366 path_list = get_exec_path(env)
367 if name != 'nt':
368 file = fsencode(file)
369 path_list = map(fsencode, path_list)
370 for dir in path_list:
Guido van Rossum61de0ac1997-12-05 21:24:30371 fullname = path.join(dir, file)
372 try:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22373 exec_func(fullname, *argrest)
Guido van Rossumb940e112007-01-10 16:19:56374 except error as e:
Guido van Rossume7ba4952007-06-06 23:52:48375 last_exc = e
Guido van Rossum683c0fe2002-09-03 16:36:17376 tb = sys.exc_info()[2]
Christian Heimes45f9af32007-11-27 21:50:00377 if (e.errno != errno.ENOENT and e.errno != errno.ENOTDIR
Guido van Rossum683c0fe2002-09-03 16:36:17378 and saved_exc is None):
379 saved_exc = e
380 saved_tb = tb
381 if saved_exc:
Benjamin Peterson4b068192009-02-20 03:19:25382 raise saved_exc.with_traceback(saved_tb)
383 raise last_exc.with_traceback(tb)
Guido van Rossumd74fb6b2001-03-02 06:43:49384
Guido van Rossumcd16bf62007-06-13 18:07:49385
Gregory P. Smithb6e8c7e2010-02-27 07:22:22386def get_exec_path(env=None):
387 """Returns the sequence of directories that will be searched for the
388 named executable (similar to a shell) when launching a process.
389
390 *env* must be an environment variable dict or None. If *env* is None,
391 os.environ will be used.
392 """
Victor Stinner273b7662010-11-06 12:59:33393 # Use a local import instead of a global import to limit the number of
394 # modules loaded at startup: the os module is always loaded at startup by
395 # Python. It may also avoid a bootstrap issue.
Victor Stinner6f35eda2010-10-29 00:38:58396 import warnings
397
Gregory P. Smithb6e8c7e2010-02-27 07:22:22398 if env is None:
399 env = environ
Victor Stinnerb745a742010-05-18 17:17:23400
Victor Stinnerbb4f2182010-11-07 15:43:39401 # {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a
402 # BytesWarning when using python -b or python -bb: ignore the warning
Victor Stinner273b7662010-11-06 12:59:33403 with warnings.catch_warnings():
404 warnings.simplefilter("ignore", BytesWarning)
Victor Stinnerb745a742010-05-18 17:17:23405
Victor Stinnerb745a742010-05-18 17:17:23406 try:
Victor Stinner273b7662010-11-06 12:59:33407 path_list = env.get('PATH')
408 except TypeError:
409 path_list = None
Victor Stinnerb745a742010-05-18 17:17:23410
Victor Stinner273b7662010-11-06 12:59:33411 if supports_bytes_environ:
412 try:
413 path_listb = env[b'PATH']
414 except (KeyError, TypeError):
415 pass
416 else:
417 if path_list is not None:
418 raise ValueError(
419 "env cannot contain 'PATH' and b'PATH' keys")
420 path_list = path_listb
421
422 if path_list is not None and isinstance(path_list, bytes):
423 path_list = fsdecode(path_list)
Victor Stinnerb745a742010-05-18 17:17:23424
425 if path_list is None:
426 path_list = defpath
427 return path_list.split(pathsep)
Gregory P. Smithb6e8c7e2010-02-27 07:22:22428
429
Skip Montanaro289bc052007-08-17 02:30:27430# Change environ to automatically call putenv(), unsetenv if they exist.
431from _abcoll import MutableMapping # Can't use collections (bootstrap)
432
433class _Environ(MutableMapping):
Victor Stinner84ae1182010-05-06 22:05:07434 def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv):
435 self.encodekey = encodekey
436 self.decodekey = decodekey
437 self.encodevalue = encodevalue
438 self.decodevalue = decodevalue
Skip Montanaro289bc052007-08-17 02:30:27439 self.putenv = putenv
440 self.unsetenv = unsetenv
Victor Stinner3d75d0c2010-09-10 22:18:16441 self._data = data
Ezio Melotti19e4acf2010-02-22 15:59:01442
Skip Montanaro289bc052007-08-17 02:30:27443 def __getitem__(self, key):
Victor Stinner3d75d0c2010-09-10 22:18:16444 value = self._data[self.encodekey(key)]
Victor Stinner84ae1182010-05-06 22:05:07445 return self.decodevalue(value)
Ezio Melotti19e4acf2010-02-22 15:59:01446
Skip Montanaro289bc052007-08-17 02:30:27447 def __setitem__(self, key, value):
Victor Stinner84ae1182010-05-06 22:05:07448 key = self.encodekey(key)
449 value = self.encodevalue(value)
Skip Montanaro289bc052007-08-17 02:30:27450 self.putenv(key, value)
Victor Stinner3d75d0c2010-09-10 22:18:16451 self._data[key] = value
Ezio Melotti19e4acf2010-02-22 15:59:01452
Skip Montanaro289bc052007-08-17 02:30:27453 def __delitem__(self, key):
Victor Stinner84ae1182010-05-06 22:05:07454 key = self.encodekey(key)
Skip Montanaro289bc052007-08-17 02:30:27455 self.unsetenv(key)
Victor Stinner3d75d0c2010-09-10 22:18:16456 del self._data[key]
Ezio Melotti19e4acf2010-02-22 15:59:01457
Skip Montanaro289bc052007-08-17 02:30:27458 def __iter__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16459 for key in self._data:
Victor Stinner84ae1182010-05-06 22:05:07460 yield self.decodekey(key)
Ezio Melotti19e4acf2010-02-22 15:59:01461
Skip Montanaro289bc052007-08-17 02:30:27462 def __len__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16463 return len(self._data)
Ezio Melotti19e4acf2010-02-22 15:59:01464
465 def __repr__(self):
Victor Stinnerbed71172010-07-28 21:25:42466 return 'environ({{{}}})'.format(', '.join(
Victor Stinnerd73c1a32010-07-28 21:23:23467 ('{!r}: {!r}'.format(self.decodekey(key), self.decodevalue(value))
Victor Stinner3d75d0c2010-09-10 22:18:16468 for key, value in self._data.items())))
Ezio Melotti19e4acf2010-02-22 15:59:01469
Skip Montanaro289bc052007-08-17 02:30:27470 def copy(self):
471 return dict(self)
Ezio Melotti19e4acf2010-02-22 15:59:01472
Skip Montanaro289bc052007-08-17 02:30:27473 def setdefault(self, key, value):
474 if key not in self:
475 self[key] = value
476 return self[key]
477
478try:
479 _putenv = putenv
480except NameError:
481 _putenv = lambda key, value: None
Martin v. Löwisa90f4382001-03-07 09:05:45482else:
Skip Montanaro289bc052007-08-17 02:30:27483 __all__.append("putenv")
Guido van Rossum3b8e20d1996-07-24 00:55:17484
Skip Montanaro289bc052007-08-17 02:30:27485try:
486 _unsetenv = unsetenv
487except NameError:
488 _unsetenv = lambda key: _putenv(key, "")
489else:
490 __all__.append("unsetenv")
Guido van Rossumc524d952001-10-19 01:31:59491
Victor Stinner84ae1182010-05-06 22:05:07492def _createenviron():
493 if name in ('os2', 'nt'):
494 # Where Env Var Names Must Be UPPERCASE
495 def check_str(value):
496 if not isinstance(value, str):
497 raise TypeError("str expected, not %s" % type(value).__name__)
498 return value
499 encode = check_str
500 decode = str
501 def encodekey(key):
502 return encode(key).upper()
503 data = {}
504 for key, value in environ.items():
505 data[encodekey(key)] = value
506 else:
507 # Where Env Var Names Can Be Mixed Case
Victor Stinnerdf6d6cb2010-10-24 20:32:26508 encoding = sys.getfilesystemencoding()
Victor Stinner84ae1182010-05-06 22:05:07509 def encode(value):
510 if not isinstance(value, str):
511 raise TypeError("str expected, not %s" % type(value).__name__)
Victor Stinnerdf6d6cb2010-10-24 20:32:26512 return value.encode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07513 def decode(value):
Victor Stinnerdf6d6cb2010-10-24 20:32:26514 return value.decode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07515 encodekey = encode
516 data = environ
517 return _Environ(data,
518 encodekey, decode,
519 encode, decode,
520 _putenv, _unsetenv)
Guido van Rossumc524d952001-10-19 01:31:59521
Victor Stinner84ae1182010-05-06 22:05:07522# unicode environ
523environ = _createenviron()
524del _createenviron
Guido van Rossum61de0ac1997-12-05 21:24:30525
Guido van Rossum5a2ca931999-11-02 13:27:32526
Jack Jansenb11ce9b2003-01-08 16:33:40527def getenv(key, default=None):
Tim Peters2c60f7a2003-01-29 03:49:43528 """Get an environment variable, return None if it doesn't exist.
Victor Stinner84ae1182010-05-06 22:05:07529 The optional second argument can specify an alternate default.
530 key, default and the result are str."""
Tim Peters2c60f7a2003-01-29 03:49:43531 return environ.get(key, default)
Guido van Rossum5a2ca931999-11-02 13:27:32532
Victor Stinnerb745a742010-05-18 17:17:23533supports_bytes_environ = name not in ('os2', 'nt')
534__all__.extend(("getenv", "supports_bytes_environ"))
535
536if supports_bytes_environ:
Victor Stinner84ae1182010-05-06 22:05:07537 def _check_bytes(value):
538 if not isinstance(value, bytes):
539 raise TypeError("bytes expected, not %s" % type(value).__name__)
540 return value
541
542 # bytes environ
Victor Stinner3d75d0c2010-09-10 22:18:16543 environb = _Environ(environ._data,
Victor Stinner84ae1182010-05-06 22:05:07544 _check_bytes, bytes,
545 _check_bytes, bytes,
546 _putenv, _unsetenv)
547 del _check_bytes
548
549 def getenvb(key, default=None):
550 """Get an environment variable, return None if it doesn't exist.
551 The optional second argument can specify an alternate default.
552 key, default and the result are bytes."""
553 return environb.get(key, default)
Victor Stinner70120e22010-07-29 17:19:38554
555 __all__.extend(("environb", "getenvb"))
Victor Stinner84ae1182010-05-06 22:05:07556
Victor Stinnerdf6d6cb2010-10-24 20:32:26557def _fscodec():
558 encoding = sys.getfilesystemencoding()
559 if encoding == 'mbcs':
Victor Stinnere882aac2010-10-24 21:12:26560 errors = 'strict'
Victor Stinner313a1202010-06-11 23:56:51561 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26562 errors = 'surrogateescape'
Victor Stinnere8d51452010-08-19 01:05:19563
Victor Stinnerdf6d6cb2010-10-24 20:32:26564 def fsencode(filename):
565 """
566 Encode filename to the filesystem encoding with 'surrogateescape' error
567 handler, return bytes unchanged. On Windows, use 'strict' error handler if
568 the file system encoding is 'mbcs' (which is the default encoding).
569 """
570 if isinstance(filename, bytes):
571 return filename
572 elif isinstance(filename, str):
573 return filename.encode(encoding, errors)
Victor Stinnere8d51452010-08-19 01:05:19574 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26575 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
576
577 def fsdecode(filename):
578 """
579 Decode filename from the filesystem encoding with 'surrogateescape' error
580 handler, return str unchanged. On Windows, use 'strict' error handler if
581 the file system encoding is 'mbcs' (which is the default encoding).
582 """
583 if isinstance(filename, str):
584 return filename
585 elif isinstance(filename, bytes):
586 return filename.decode(encoding, errors)
587 else:
588 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
589
590 return fsencode, fsdecode
591
592fsencode, fsdecode = _fscodec()
593del _fscodec
Victor Stinner449c4662010-05-08 11:10:09594
Guido van Rossum5a2ca931999-11-02 13:27:32595def _exists(name):
Benjamin Peterson87c8d872009-06-11 22:54:11596 return name in globals()
Guido van Rossum5a2ca931999-11-02 13:27:32597
598# Supply spawn*() (probably only for Unix)
599if _exists("fork") and not _exists("spawnv") and _exists("execv"):
600
601 P_WAIT = 0
602 P_NOWAIT = P_NOWAITO = 1
603
604 # XXX Should we support P_DETACH? I suppose it could fork()**2
605 # and close the std I/O streams. Also, P_OVERLAY is the same
606 # as execv*()?
607
608 def _spawnvef(mode, file, args, env, func):
609 # Internal helper; func is the exec*() function to use
610 pid = fork()
611 if not pid:
612 # Child
613 try:
614 if env is None:
615 func(file, args)
616 else:
617 func(file, args, env)
618 except:
619 _exit(127)
620 else:
621 # Parent
622 if mode == P_NOWAIT:
623 return pid # Caller is responsible for waiting!
624 while 1:
625 wpid, sts = waitpid(pid, 0)
626 if WIFSTOPPED(sts):
627 continue
628 elif WIFSIGNALED(sts):
629 return -WTERMSIG(sts)
630 elif WIFEXITED(sts):
631 return WEXITSTATUS(sts)
632 else:
Collin Winter828f04a2007-08-31 00:04:24633 raise error("Not stopped, signaled or exited???")
Guido van Rossum5a2ca931999-11-02 13:27:32634
635 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36636 """spawnv(mode, file, args) -> integer
637
638Execute file with arguments from args in a subprocess.
639If mode == P_NOWAIT return the pid of the process.
640If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52641otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32642 return _spawnvef(mode, file, args, None, execv)
643
644 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36645 """spawnve(mode, file, args, env) -> integer
646
647Execute file with arguments from args in a subprocess with the
648specified environment.
649If mode == P_NOWAIT return the pid of the process.
650If mode == P_WAIT return the process's exit code if it exits normally;
651otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32652 return _spawnvef(mode, file, args, env, execve)
653
Guido van Rossumdd7cbbf1999-11-02 20:44:07654 # Note: spawnvp[e] is't currently supported on Windows
655
656 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36657 """spawnvp(mode, file, args) -> integer
658
659Execute file (which is looked for along $PATH) with arguments from
660args in a subprocess.
661If mode == P_NOWAIT return the pid of the process.
662If mode == P_WAIT return the process's exit code if it exits normally;
663otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07664 return _spawnvef(mode, file, args, None, execvp)
665
666 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36667 """spawnvpe(mode, file, args, env) -> integer
668
669Execute file (which is looked for along $PATH) with arguments from
670args in a subprocess with the supplied environment.
671If mode == P_NOWAIT return the pid of the process.
672If mode == P_WAIT return the process's exit code if it exits normally;
673otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07674 return _spawnvef(mode, file, args, env, execvpe)
675
676if _exists("spawnv"):
677 # These aren't supplied by the basic Windows code
678 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32679
680 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36681 """spawnl(mode, file, *args) -> integer
682
683Execute file with arguments from args in a subprocess.
684If mode == P_NOWAIT return the pid of the process.
685If mode == P_WAIT return the process's exit code if it exits normally;
686otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32687 return spawnv(mode, file, args)
688
689 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36690 """spawnle(mode, file, *args, env) -> integer
691
692Execute file with arguments from args in a subprocess with the
693supplied environment.
694If mode == P_NOWAIT return the pid of the process.
695If mode == P_WAIT return the process's exit code if it exits normally;
696otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32697 env = args[-1]
698 return spawnve(mode, file, args[:-1], env)
699
Andrew MacIntyre69e18c92004-04-04 07:11:43700
701 __all__.extend(["spawnv", "spawnve", "spawnl", "spawnle",])
702
703
Guido van Rossumdd7cbbf1999-11-02 20:44:07704if _exists("spawnvp"):
705 # At the moment, Windows doesn't implement spawnvp[e],
706 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32707 def spawnlp(mode, file, *args):
Neal Norwitzb7f68102003-07-02 02:49:33708 """spawnlp(mode, file, *args) -> integer
Guido van Rossume0cd2912000-04-21 18:35:36709
710Execute file (which is looked for along $PATH) with arguments from
711args in a subprocess with the supplied environment.
712If mode == P_NOWAIT return the pid of the process.
713If mode == P_WAIT return the process's exit code if it exits normally;
714otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32715 return spawnvp(mode, file, args)
716
717 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36718 """spawnlpe(mode, file, *args, env) -> integer
719
720Execute file (which is looked for along $PATH) with arguments from
721args in a subprocess with the supplied environment.
722If mode == P_NOWAIT return the pid of the process.
723If mode == P_WAIT return the process's exit code if it exits normally;
724otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32725 env = args[-1]
726 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36727
728
Andrew MacIntyre69e18c92004-04-04 07:11:43729 __all__.extend(["spawnvp", "spawnvpe", "spawnlp", "spawnlpe",])
Skip Montanaro269b83b2001-02-06 01:07:02730
Alexandre Vassalottif7fa63d2008-05-11 08:55:36731import copyreg as _copyreg
Michael W. Hudson0e025302002-03-06 17:11:18732
733def _make_stat_result(tup, dict):
734 return stat_result(tup, dict)
735
736def _pickle_stat_result(sr):
737 (type, args) = sr.__reduce__()
738 return (_make_stat_result, args)
739
Michael W. Hudsonce00b732002-03-15 10:18:58740try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36741 _copyreg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
Michael W. Hudsonce00b732002-03-15 10:18:58742except NameError: # stat_result may not exist
743 pass
Michael W. Hudson0e025302002-03-06 17:11:18744
745def _make_statvfs_result(tup, dict):
746 return statvfs_result(tup, dict)
747
748def _pickle_statvfs_result(sr):
749 (type, args) = sr.__reduce__()
750 return (_make_statvfs_result, args)
751
Michael W. Hudsonce00b732002-03-15 10:18:58752try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36753 _copyreg.pickle(statvfs_result, _pickle_statvfs_result,
Michael W. Hudsonce00b732002-03-15 10:18:58754 _make_statvfs_result)
Michael W. Hudsone5363b72002-03-15 10:21:59755except NameError: # statvfs_result may not exist
Michael W. Hudsonce00b732002-03-15 10:18:58756 pass
Martin v. Löwisdc3883f2004-08-29 15:46:35757
Guido van Rossumc2f93dc2007-05-24 00:50:02758# Supply os.popen()
Antoine Pitrou877766d2011-03-19 16:00:37759def popen(cmd, mode="r", buffering=-1):
Guido van Rossum3172c5d2007-10-16 18:12:55760 if not isinstance(cmd, str):
Guido van Rossumc2f93dc2007-05-24 00:50:02761 raise TypeError("invalid cmd type (%s, expected string)" % type(cmd))
762 if mode not in ("r", "w"):
763 raise ValueError("invalid mode %r" % mode)
Antoine Pitrou877766d2011-03-19 16:00:37764 if buffering == 0 or buffering == None:
765 raise ValueError("popen() does not support unbuffered streams")
Guido van Rossumc2f93dc2007-05-24 00:50:02766 import subprocess, io
767 if mode == "r":
768 proc = subprocess.Popen(cmd,
769 shell=True,
770 stdout=subprocess.PIPE,
771 bufsize=buffering)
772 return _wrap_close(io.TextIOWrapper(proc.stdout), proc)
773 else:
774 proc = subprocess.Popen(cmd,
775 shell=True,
776 stdin=subprocess.PIPE,
777 bufsize=buffering)
778 return _wrap_close(io.TextIOWrapper(proc.stdin), proc)
779
780# Helper for popen() -- a proxy for a file whose close waits for the process
781class _wrap_close:
782 def __init__(self, stream, proc):
783 self._stream = stream
784 self._proc = proc
785 def close(self):
786 self._stream.close()
Amaury Forgeot d'Arc97e5f282009-07-11 09:35:13787 returncode = self._proc.wait()
788 if returncode == 0:
789 return None
790 if name == 'nt':
791 return returncode
792 else:
793 return returncode << 8 # Shift left to match old behavior
Antoine Pitrouac625352009-12-09 00:01:27794 def __enter__(self):
795 return self
796 def __exit__(self, *args):
797 self.close()
Guido van Rossumc2f93dc2007-05-24 00:50:02798 def __getattr__(self, name):
799 return getattr(self._stream, name)
Thomas Heller476157b2007-09-04 11:27:47800 def __iter__(self):
801 return iter(self._stream)
Guido van Rossumc2f93dc2007-05-24 00:50:02802
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49803# Supply os.fdopen()
804def fdopen(fd, *args, **kwargs):
Guido van Rossumc2f93dc2007-05-24 00:50:02805 if not isinstance(fd, int):
806 raise TypeError("invalid fd type (%s, expected integer)" % type(fd))
807 import io
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49808 return io.open(fd, *args, **kwargs)