blob: 2fdf6688a94bea970c2c318040197774524df2fb [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 '\\')
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +000010 - os.altsep is the alternate pathname separator (None or '/')
Guido van Rossum54f22ed2000-02-04 15:10:34 +000011 - os.pathsep is the component separator used in $PATH etc
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +000012 - os.linesep is the line separator in text files ('\r' or '\n' or '\r\n')
Guido van Rossum54f22ed2000-02-04 15:10:34 +000013 - os.defpath is the default search path for executables
Martin v. Löwisbdec50f2004-06-08 08:29:33 +000014 - os.devnull is the file path of the null device ('/dev/null', etc.)
Guido van Rossum31104f41992-01-14 18:28:36 +000015
Guido van Rossum54f22ed2000-02-04 15:10:34 +000016Programs that import and use 'os' stand a better chance of being
17portable between different platforms. Of course, they must then
18only use functions that are defined by all platforms (e.g., unlink
19and opendir), and leave all pathname manipulation to os.path
20(e.g., split and join).
21"""
Guido van Rossum31104f41992-01-14 18:28:36 +000022
Skip Montanaro269b83b2001-02-06 01:07:02 +000023#'
24
Christian Heimes45f9af32007-11-27 21:50:00 +000025import sys, errno
Guido van Rossuma28dab51997-08-29 22:36:47 +000026
27_names = sys.builtin_module_names
28
Tim Petersc4e09402003-04-25 07:11:48 +000029# Note: more names are added to __all__ later.
Skip Montanaro6c0a0e12001-02-28 01:00:58 +000030__all__ = ["altsep", "curdir", "pardir", "sep", "pathsep", "linesep",
Martin v. Löwis22b457e2005-01-16 08:40:58 +000031 "defpath", "name", "path", "devnull",
32 "SEEK_SET", "SEEK_CUR", "SEEK_END"]
Skip Montanaro269b83b2001-02-06 01:07:02 +000033
34def _get_exports_list(module):
35 try:
36 return list(module.__all__)
37 except AttributeError:
38 return [n for n in dir(module) if n[0] != '_']
39
Guido van Rossuma28dab51997-08-29 22:36:47 +000040if 'posix' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000041 name = 'posix'
Guido van Rossume9387ea1998-05-22 15:26:04 +000042 linesep = '\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000043 from posix import *
44 try:
45 from posix import _exit
46 except ImportError:
47 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000048 import posixpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000049
Skip Montanaro269b83b2001-02-06 01:07:02 +000050 import posix
51 __all__.extend(_get_exports_list(posix))
52 del posix
53
Guido van Rossuma28dab51997-08-29 22:36:47 +000054elif 'nt' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000055 name = 'nt'
Guido van Rossume9387ea1998-05-22 15:26:04 +000056 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000057 from nt import *
Tim Peters6757c1e2003-01-08 21:20:57 +000058 try:
59 from nt import _exit
60 except ImportError:
61 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000062 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000063
Skip Montanaro269b83b2001-02-06 01:07:02 +000064 import nt
65 __all__.extend(_get_exports_list(nt))
66 del nt
67
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000068elif 'os2' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000069 name = 'os2'
Guido van Rossume9387ea1998-05-22 15:26:04 +000070 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000071 from os2 import *
72 try:
73 from os2 import _exit
74 except ImportError:
75 pass
Andrew MacIntyre5cef5712002-02-24 05:32:32 +000076 if sys.version.find('EMX GCC') == -1:
Skip Montanaro117910d2003-02-14 19:35:31 +000077 import ntpath as path
Andrew MacIntyre5cef5712002-02-24 05:32:32 +000078 else:
Skip Montanaro117910d2003-02-14 19:35:31 +000079 import os2emxpath as path
Andrew MacIntyre89f98652003-12-02 12:33:01 +000080 from _emx_link import link
Tim Petersf2715e02003-02-19 02:35:07 +000081
Skip Montanaro269b83b2001-02-06 01:07:02 +000082 import os2
83 __all__.extend(_get_exports_list(os2))
84 del os2
85
Guido van Rossum18df5d41999-06-11 01:37:27 +000086elif 'ce' in _names:
87 name = 'ce'
88 linesep = '\r\n'
Guido van Rossum18df5d41999-06-11 01:37:27 +000089 from ce import *
Tim Peters6757c1e2003-01-08 21:20:57 +000090 try:
91 from ce import _exit
92 except ImportError:
93 pass
Guido van Rossum18df5d41999-06-11 01:37:27 +000094 # We can use the standard Windows path.
Skip Montanaro117910d2003-02-14 19:35:31 +000095 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000096
Skip Montanaro269b83b2001-02-06 01:07:02 +000097 import ce
98 __all__.extend(_get_exports_list(ce))
99 del ce
100
Guido van Rossum2979b011994-08-01 11:18:30 +0000101else:
Collin Winter828f04a2007-08-31 00:04:24 +0000102 raise ImportError('no os specific module found')
Guido van Rossume65cce51993-11-08 15:05:21 +0000103
Skip Montanaro117910d2003-02-14 19:35:31 +0000104sys.modules['os.path'] = path
Skip Montanaro7a98be22007-08-16 14:35:24 +0000105from os.path import curdir, pardir, sep, pathsep, defpath, altsep, devnull
Skip Montanaro269b83b2001-02-06 01:07:02 +0000106
Guido van Rossuma28dab51997-08-29 22:36:47 +0000107del _names
108
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000109# Python uses fixed values for the SEEK_ constants; they are mapped
110# to native constants if necessary in posixmodule.c
111SEEK_SET = 0
112SEEK_CUR = 1
113SEEK_END = 2
114
Skip Montanaro269b83b2001-02-06 01:07:02 +0000115#'
116
Guido van Rossum4def7de1998-07-24 20:48:03 +0000117# Super directory utilities.
118# (Inspired by Eric Raymond; the doc strings are mostly his)
119
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000120def makedirs(name, mode=0o777):
121 """makedirs(path [, mode=0o777])
Guido van Rossum4def7de1998-07-24 20:48:03 +0000122
123 Super-mkdir; create a leaf directory and all intermediate ones.
124 Works like mkdir, except that any intermediate path segment (not
125 just the rightmost) will be created if it does not exist. This is
126 recursive.
127
128 """
129 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000130 if not tail:
131 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000132 if head and tail and not path.exists(head):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000133 try:
134 makedirs(head, mode)
Guido van Rossumb940e112007-01-10 16:19:56 +0000135 except OSError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000136 # be happy if someone already created the path
Christian Heimes45f9af32007-11-27 21:50:00 +0000137 if e.errno != errno.EEXIST:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000138 raise
Andrew M. Kuchling6fccc8a2003-12-23 16:33:28 +0000139 if tail == curdir: # xxx/newdir/. exists if xxx/newdir exists
140 return
Guido van Rossum4def7de1998-07-24 20:48:03 +0000141 mkdir(name, mode)
142
143def removedirs(name):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000144 """removedirs(path)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000145
Fredrik Lundh96c1c7a2005-11-12 15:55:04 +0000146 Super-rmdir; remove a leaf directory and all empty intermediate
Guido van Rossum4def7de1998-07-24 20:48:03 +0000147 ones. Works like rmdir except that, if the leaf directory is
148 successfully removed, directories corresponding to rightmost path
Tim Petersc4e09402003-04-25 07:11:48 +0000149 segments will be pruned away until either the whole path is
Guido van Rossum4def7de1998-07-24 20:48:03 +0000150 consumed or an error occurs. Errors during this latter phase are
151 ignored -- they generally mean that a directory was not empty.
152
153 """
154 rmdir(name)
155 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000156 if not tail:
157 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000158 while head and tail:
159 try:
160 rmdir(head)
161 except error:
162 break
163 head, tail = path.split(head)
164
165def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000166 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000167
168 Super-rename; create directories as necessary and delete any left
169 empty. Works like rename, except creation of any intermediate
170 directories needed to make the new pathname good is attempted
171 first. After the rename, directories corresponding to rightmost
172 path segments of the old name will be pruned way until either the
173 whole path is consumed or a nonempty directory is found.
174
175 Note: this function can fail with the new directory structure made
176 if you lack permissions needed to unlink the leaf directory or
177 file.
178
179 """
180 head, tail = path.split(new)
181 if head and tail and not path.exists(head):
182 makedirs(head)
183 rename(old, new)
184 head, tail = path.split(old)
185 if head and tail:
186 try:
187 removedirs(head)
188 except error:
189 pass
190
Skip Montanaro269b83b2001-02-06 01:07:02 +0000191__all__.extend(["makedirs", "removedirs", "renames"])
192
Guido van Rossumd8faa362007-04-27 19:54:29 +0000193def walk(top, topdown=True, onerror=None, followlinks=False):
Tim Petersc4e09402003-04-25 07:11:48 +0000194 """Directory tree generator.
195
196 For each directory in the directory tree rooted at top (including top
197 itself, but excluding '.' and '..'), yields a 3-tuple
198
199 dirpath, dirnames, filenames
200
201 dirpath is a string, the path to the directory. dirnames is a list of
202 the names of the subdirectories in dirpath (excluding '.' and '..').
203 filenames is a list of the names of the non-directory files in dirpath.
204 Note that the names in the lists are just names, with no path components.
205 To get a full path (which begins with top) to a file or directory in
206 dirpath, do os.path.join(dirpath, name).
207
208 If optional arg 'topdown' is true or not specified, the triple for a
209 directory is generated before the triples for any of its subdirectories
210 (directories are generated top down). If topdown is false, the triple
211 for a directory is generated after the triples for all of its
212 subdirectories (directories are generated bottom up).
213
214 When topdown is true, the caller can modify the dirnames list in-place
215 (e.g., via del or slice assignment), and walk will only recurse into the
216 subdirectories whose names remain in dirnames; this can be used to prune
217 the search, or to impose a specific order of visiting. Modifying
218 dirnames when topdown is false is ineffective, since the directories in
219 dirnames have already been generated by the time dirnames itself is
220 generated.
221
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000222 By default errors from the os.listdir() call are ignored. If
223 optional arg 'onerror' is specified, it should be a function; it
224 will be called with one argument, an os.error instance. It can
225 report the error to continue with the walk, or raise the exception
226 to abort the walk. Note that the filename is available as the
227 filename attribute of the exception object.
228
Guido van Rossumd8faa362007-04-27 19:54:29 +0000229 By default, os.walk does not follow symbolic links to subdirectories on
230 systems that support them. In order to get this functionality, set the
231 optional argument 'followlinks' to true.
232
Tim Petersc4e09402003-04-25 07:11:48 +0000233 Caution: if you pass a relative pathname for top, don't change the
234 current working directory between resumptions of walk. walk never
235 changes the current directory, and assumes that the client doesn't
236 either.
237
238 Example:
239
Christian Heimes5d8da202008-05-06 13:58:24 +0000240 import os
Tim Petersc4e09402003-04-25 07:11:48 +0000241 from os.path import join, getsize
Christian Heimes5d8da202008-05-06 13:58:24 +0000242 for root, dirs, files in os.walk('python/Lib/email'):
Neal Norwitz752abd02008-05-13 04:55:24 +0000243 print(root, "consumes", end="")
244 print(sum([getsize(join(root, name)) for name in files]), end="")
245 print("bytes in", len(files), "non-directory files")
Tim Petersc4e09402003-04-25 07:11:48 +0000246 if 'CVS' in dirs:
247 dirs.remove('CVS') # don't visit CVS directories
248 """
249
250 from os.path import join, isdir, islink
251
252 # We may not have read permission for top, in which case we can't
Alexandre Vassalotti4e6531e2008-05-09 20:00:17 +0000253 # get a list of the files the directory contains. os.walk
Tim Petersc4e09402003-04-25 07:11:48 +0000254 # always suppressed the exception then, rather than blow up for a
255 # minor reason when (say) a thousand readable directories are still
256 # left to visit. That logic is copied here.
257 try:
258 # Note that listdir and error are globals in this module due
259 # to earlier import-*.
260 names = listdir(top)
Guido van Rossumb940e112007-01-10 16:19:56 +0000261 except error as err:
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000262 if onerror is not None:
263 onerror(err)
Tim Petersc4e09402003-04-25 07:11:48 +0000264 return
265
266 dirs, nondirs = [], []
267 for name in names:
268 if isdir(join(top, name)):
269 dirs.append(name)
270 else:
271 nondirs.append(name)
272
273 if topdown:
274 yield top, dirs, nondirs
275 for name in dirs:
276 path = join(top, name)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000277 if followlinks or not islink(path):
278 for x in walk(path, topdown, onerror, followlinks):
Tim Petersc4e09402003-04-25 07:11:48 +0000279 yield x
280 if not topdown:
281 yield top, dirs, nondirs
282
283__all__.append("walk")
284
Guido van Rossuma28dab51997-08-29 22:36:47 +0000285# Make sure os.environ exists, at least
286try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000287 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000288except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000289 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000290
Guido van Rossume65cce51993-11-08 15:05:21 +0000291def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000292 """execl(file, *args)
293
294 Execute the executable file with argument list args, replacing the
295 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000296 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000297
298def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000299 """execle(file, *args, env)
300
301 Execute the executable file with argument list args and
302 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000303 env = args[-1]
304 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000305
306def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000307 """execlp(file, *args)
308
309 Execute the executable file (which is searched for along $PATH)
310 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000311 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000312
Guido van Rossum030afb11995-03-14 17:27:18 +0000313def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000314 """execlpe(file, *args, env)
315
316 Execute the executable file (which is searched for along $PATH)
317 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000318 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000319 env = args[-1]
320 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000321
Guido van Rossume65cce51993-11-08 15:05:21 +0000322def execvp(file, args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000323 """execp(file, args)
324
325 Execute the executable file (which is searched for along $PATH)
326 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000327 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000328 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000329
330def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000331 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000332
333 Execute the executable file (which is searched for along $PATH)
334 with argument list args and environment env , replacing the
335 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000336 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000337 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000338
Skip Montanaro269b83b2001-02-06 01:07:02 +0000339__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
340
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000341def _execvpe(file, args, env=None):
342 if env is not None:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000343 func = execve
344 argrest = (args, env)
345 else:
346 func = execv
347 argrest = (args,)
348 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000349
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000350 head, tail = path.split(file)
351 if head:
Guido van Rossum68468eb2003-02-27 20:14:51 +0000352 func(file, *argrest)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000353 return
Raymond Hettinger54f02222002-06-01 14:18:47 +0000354 if 'PATH' in env:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000355 envpath = env['PATH']
356 else:
357 envpath = defpath
Guido van Rossum965fdae2000-04-04 19:50:04 +0000358 PATH = envpath.split(pathsep)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000359 last_exc = saved_exc = None
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000360 saved_tb = None
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000361 for dir in PATH:
362 fullname = path.join(dir, file)
363 try:
Guido van Rossum68468eb2003-02-27 20:14:51 +0000364 func(fullname, *argrest)
Guido van Rossumb940e112007-01-10 16:19:56 +0000365 except error as e:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000366 last_exc = e
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000367 tb = sys.exc_info()[2]
Christian Heimes45f9af32007-11-27 21:50:00 +0000368 if (e.errno != errno.ENOENT and e.errno != errno.ENOTDIR
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000369 and saved_exc is None):
370 saved_exc = e
371 saved_tb = tb
372 if saved_exc:
Collin Winter828f04a2007-08-31 00:04:24 +0000373 raise error(saved_exc).with_traceback(saved_tb)
374 raise error(last_exc).with_traceback(tb)
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000375
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000376
Skip Montanaro289bc052007-08-17 02:30:27 +0000377# Change environ to automatically call putenv(), unsetenv if they exist.
378from _abcoll import MutableMapping # Can't use collections (bootstrap)
379
380class _Environ(MutableMapping):
381 def __init__(self, environ, keymap, putenv, unsetenv):
382 self.keymap = keymap
383 self.putenv = putenv
384 self.unsetenv = unsetenv
385 self.data = data = {}
386 for key, value in environ.items():
387 data[keymap(key)] = str(value)
388 def __getitem__(self, key):
389 return self.data[self.keymap(key)]
390 def __setitem__(self, key, value):
391 value = str(value)
392 self.putenv(key, value)
393 self.data[self.keymap(key)] = value
394 def __delitem__(self, key):
395 self.unsetenv(key)
396 del self.data[self.keymap(key)]
397 def __iter__(self):
398 for key in self.data:
399 yield key
400 def __len__(self):
401 return len(self.data)
402 def copy(self):
403 return dict(self)
404 def setdefault(self, key, value):
405 if key not in self:
406 self[key] = value
407 return self[key]
408
409try:
410 _putenv = putenv
411except NameError:
412 _putenv = lambda key, value: None
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000413else:
Skip Montanaro289bc052007-08-17 02:30:27 +0000414 __all__.append("putenv")
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000415
Skip Montanaro289bc052007-08-17 02:30:27 +0000416try:
417 _unsetenv = unsetenv
418except NameError:
419 _unsetenv = lambda key: _putenv(key, "")
420else:
421 __all__.append("unsetenv")
Guido van Rossumc524d952001-10-19 01:31:59 +0000422
Skip Montanaro289bc052007-08-17 02:30:27 +0000423if name in ('os2', 'nt'): # Where Env Var Names Must Be UPPERCASE
424 _keymap = lambda key: str(key.upper())
425else: # Where Env Var Names Can Be Mixed Case
426 _keymap = lambda key: str(key)
Guido van Rossumc524d952001-10-19 01:31:59 +0000427
Skip Montanaro289bc052007-08-17 02:30:27 +0000428environ = _Environ(environ, _keymap, _putenv, _unsetenv)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000429
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000430
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000431def getenv(key, default=None):
Tim Peters2c60f7a2003-01-29 03:49:43 +0000432 """Get an environment variable, return None if it doesn't exist.
433 The optional second argument can specify an alternate default."""
434 return environ.get(key, default)
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000435__all__.append("getenv")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000436
437def _exists(name):
438 try:
439 eval(name)
Tim Petersbc0e9102002-04-04 22:55:58 +0000440 return True
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000441 except NameError:
Tim Petersbc0e9102002-04-04 22:55:58 +0000442 return False
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000443
444# Supply spawn*() (probably only for Unix)
445if _exists("fork") and not _exists("spawnv") and _exists("execv"):
446
447 P_WAIT = 0
448 P_NOWAIT = P_NOWAITO = 1
449
450 # XXX Should we support P_DETACH? I suppose it could fork()**2
451 # and close the std I/O streams. Also, P_OVERLAY is the same
452 # as execv*()?
453
454 def _spawnvef(mode, file, args, env, func):
455 # Internal helper; func is the exec*() function to use
456 pid = fork()
457 if not pid:
458 # Child
459 try:
460 if env is None:
461 func(file, args)
462 else:
463 func(file, args, env)
464 except:
465 _exit(127)
466 else:
467 # Parent
468 if mode == P_NOWAIT:
469 return pid # Caller is responsible for waiting!
470 while 1:
471 wpid, sts = waitpid(pid, 0)
472 if WIFSTOPPED(sts):
473 continue
474 elif WIFSIGNALED(sts):
475 return -WTERMSIG(sts)
476 elif WIFEXITED(sts):
477 return WEXITSTATUS(sts)
478 else:
Collin Winter828f04a2007-08-31 00:04:24 +0000479 raise error("Not stopped, signaled or exited???")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000480
481 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000482 """spawnv(mode, file, args) -> integer
483
484Execute file with arguments from args in a subprocess.
485If mode == P_NOWAIT return the pid of the process.
486If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000487otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000488 return _spawnvef(mode, file, args, None, execv)
489
490 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000491 """spawnve(mode, file, args, env) -> integer
492
493Execute file with arguments from args in a subprocess with the
494specified environment.
495If mode == P_NOWAIT return the pid of the process.
496If mode == P_WAIT return the process's exit code if it exits normally;
497otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000498 return _spawnvef(mode, file, args, env, execve)
499
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000500 # Note: spawnvp[e] is't currently supported on Windows
501
502 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000503 """spawnvp(mode, file, args) -> integer
504
505Execute file (which is looked for along $PATH) with arguments from
506args in a subprocess.
507If mode == P_NOWAIT return the pid of the process.
508If mode == P_WAIT return the process's exit code if it exits normally;
509otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000510 return _spawnvef(mode, file, args, None, execvp)
511
512 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000513 """spawnvpe(mode, file, args, env) -> integer
514
515Execute file (which is looked for along $PATH) with arguments from
516args in a subprocess with the supplied environment.
517If mode == P_NOWAIT return the pid of the process.
518If mode == P_WAIT return the process's exit code if it exits normally;
519otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000520 return _spawnvef(mode, file, args, env, execvpe)
521
522if _exists("spawnv"):
523 # These aren't supplied by the basic Windows code
524 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000525
526 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000527 """spawnl(mode, file, *args) -> integer
528
529Execute file with arguments from args in a subprocess.
530If mode == P_NOWAIT return the pid of the process.
531If mode == P_WAIT return the process's exit code if it exits normally;
532otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000533 return spawnv(mode, file, args)
534
535 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000536 """spawnle(mode, file, *args, env) -> integer
537
538Execute file with arguments from args in a subprocess with the
539supplied environment.
540If mode == P_NOWAIT return the pid of the process.
541If mode == P_WAIT return the process's exit code if it exits normally;
542otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000543 env = args[-1]
544 return spawnve(mode, file, args[:-1], env)
545
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000546
547 __all__.extend(["spawnv", "spawnve", "spawnl", "spawnle",])
548
549
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000550if _exists("spawnvp"):
551 # At the moment, Windows doesn't implement spawnvp[e],
552 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000553 def spawnlp(mode, file, *args):
Neal Norwitzb7f68102003-07-02 02:49:33 +0000554 """spawnlp(mode, file, *args) -> integer
Guido van Rossume0cd2912000-04-21 18:35:36 +0000555
556Execute file (which is looked for along $PATH) with arguments from
557args in a subprocess with the supplied environment.
558If mode == P_NOWAIT return the pid of the process.
559If mode == P_WAIT return the process's exit code if it exits normally;
560otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000561 return spawnvp(mode, file, args)
562
563 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000564 """spawnlpe(mode, file, *args, env) -> integer
565
566Execute file (which is looked for along $PATH) with arguments from
567args in a subprocess with the supplied environment.
568If mode == P_NOWAIT return the pid of the process.
569If mode == P_WAIT return the process's exit code if it exits normally;
570otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000571 env = args[-1]
572 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000573
574
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000575 __all__.extend(["spawnvp", "spawnvpe", "spawnlp", "spawnlpe",])
Skip Montanaro269b83b2001-02-06 01:07:02 +0000576
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000577import copyreg as _copyreg
Michael W. Hudson0e025302002-03-06 17:11:18 +0000578
579def _make_stat_result(tup, dict):
580 return stat_result(tup, dict)
581
582def _pickle_stat_result(sr):
583 (type, args) = sr.__reduce__()
584 return (_make_stat_result, args)
585
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000586try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000587 _copyreg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000588except NameError: # stat_result may not exist
589 pass
Michael W. Hudson0e025302002-03-06 17:11:18 +0000590
591def _make_statvfs_result(tup, dict):
592 return statvfs_result(tup, dict)
593
594def _pickle_statvfs_result(sr):
595 (type, args) = sr.__reduce__()
596 return (_make_statvfs_result, args)
597
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000598try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000599 _copyreg.pickle(statvfs_result, _pickle_statvfs_result,
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000600 _make_statvfs_result)
Michael W. Hudsone5363b72002-03-15 10:21:59 +0000601except NameError: # statvfs_result may not exist
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000602 pass
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000603
604if not _exists("urandom"):
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000605 def urandom(n):
606 """urandom(n) -> str
Tim Peters45e77c52004-08-29 18:47:31 +0000607
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000608 Return a string of n random bytes suitable for cryptographic use.
609
Tim Peters45e77c52004-08-29 18:47:31 +0000610 """
Georg Brandl9e43acf2005-07-04 17:16:07 +0000611 try:
612 _urandomfd = open("/dev/urandom", O_RDONLY)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000613 except (OSError, IOError):
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000614 raise NotImplementedError("/dev/urandom (or equivalent) not found")
Guido van Rossum572dbf82007-04-27 23:53:51 +0000615 bs = b""
616 while len(bs) < n:
617 bs += read(_urandomfd, n - len(bs))
Georg Brandl9e43acf2005-07-04 17:16:07 +0000618 close(_urandomfd)
Guido van Rossum572dbf82007-04-27 23:53:51 +0000619 return bs
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000620
621# Supply os.popen()
622def popen(cmd, mode="r", buffering=None):
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000623 if not isinstance(cmd, str):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000624 raise TypeError("invalid cmd type (%s, expected string)" % type(cmd))
625 if mode not in ("r", "w"):
626 raise ValueError("invalid mode %r" % mode)
627 import subprocess, io
628 if mode == "r":
629 proc = subprocess.Popen(cmd,
630 shell=True,
631 stdout=subprocess.PIPE,
632 bufsize=buffering)
633 return _wrap_close(io.TextIOWrapper(proc.stdout), proc)
634 else:
635 proc = subprocess.Popen(cmd,
636 shell=True,
637 stdin=subprocess.PIPE,
638 bufsize=buffering)
639 return _wrap_close(io.TextIOWrapper(proc.stdin), proc)
640
641# Helper for popen() -- a proxy for a file whose close waits for the process
642class _wrap_close:
643 def __init__(self, stream, proc):
644 self._stream = stream
645 self._proc = proc
646 def close(self):
647 self._stream.close()
648 return self._proc.wait() << 8 # Shift left to match old behavior
649 def __getattr__(self, name):
650 return getattr(self._stream, name)
Thomas Heller476157b2007-09-04 11:27:47 +0000651 def __iter__(self):
652 return iter(self._stream)
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000653
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +0000654# Supply os.fdopen()
655def fdopen(fd, *args, **kwargs):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000656 if not isinstance(fd, int):
657 raise TypeError("invalid fd type (%s, expected integer)" % type(fd))
658 import io
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +0000659 return io.open(fd, *args, **kwargs)