blob: a1a35cd8e366c060083a3a42d393359adc2693cb [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
Charles-François Natali7372b062012-02-05 15:15:38 +010027import stat as st
Guido van Rossuma28dab51997-08-29 22:36:47 +000028
29_names = sys.builtin_module_names
30
Tim Petersc4e09402003-04-25 07:11:48 +000031# Note: more names are added to __all__ later.
Brett Cannon13962fc2008-08-18 01:45:29 +000032__all__ = ["altsep", "curdir", "pardir", "sep", "pathsep", "linesep",
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030033 "defpath", "name", "path", "devnull", "SEEK_SET", "SEEK_CUR",
34 "SEEK_END", "fsencode", "fsdecode", "get_exec_path", "fdopen",
35 "popen", "extsep"]
Skip Montanaro269b83b2001-02-06 01:07:02 +000036
Charles-François Natali7372b062012-02-05 15:15:38 +010037def _exists(name):
38 return name in globals()
39
Skip Montanaro269b83b2001-02-06 01:07:02 +000040def _get_exports_list(module):
41 try:
42 return list(module.__all__)
43 except AttributeError:
44 return [n for n in dir(module) if n[0] != '_']
45
Brett Cannonfd074152012-04-14 14:10:13 -040046# Any new dependencies of the os module and/or changes in path separator
47# requires updating importlib as well.
Guido van Rossuma28dab51997-08-29 22:36:47 +000048if 'posix' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000049 name = 'posix'
Guido van Rossume9387ea1998-05-22 15:26:04 +000050 linesep = '\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000051 from posix import *
52 try:
53 from posix import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030054 __all__.append('_exit')
Guido van Rossum61de0ac1997-12-05 21:24:30 +000055 except ImportError:
56 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000057 import posixpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000058
Skip Montanaro269b83b2001-02-06 01:07:02 +000059 import posix
60 __all__.extend(_get_exports_list(posix))
61 del posix
62
Guido van Rossuma28dab51997-08-29 22:36:47 +000063elif 'nt' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000064 name = 'nt'
Guido van Rossume9387ea1998-05-22 15:26:04 +000065 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000066 from nt import *
Tim Peters6757c1e2003-01-08 21:20:57 +000067 try:
68 from nt import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030069 __all__.append('_exit')
Tim Peters6757c1e2003-01-08 21:20:57 +000070 except ImportError:
71 pass
Skip Montanaro117910d2003-02-14 19:35:31 +000072 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +000073
Skip Montanaro269b83b2001-02-06 01:07:02 +000074 import nt
75 __all__.extend(_get_exports_list(nt))
76 del nt
77
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000078elif 'os2' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000079 name = 'os2'
Guido van Rossume9387ea1998-05-22 15:26:04 +000080 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000081 from os2 import *
82 try:
83 from os2 import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +030084 __all__.append('_exit')
Guido van Rossum61de0ac1997-12-05 21:24:30 +000085 except ImportError:
86 pass
Andrew MacIntyre5cef5712002-02-24 05:32:32 +000087 if sys.version.find('EMX GCC') == -1:
Skip Montanaro117910d2003-02-14 19:35:31 +000088 import ntpath as path
Andrew MacIntyre5cef5712002-02-24 05:32:32 +000089 else:
Skip Montanaro117910d2003-02-14 19:35:31 +000090 import os2emxpath as path
Andrew MacIntyre89f98652003-12-02 12:33:01 +000091 from _emx_link import link
Tim Petersf2715e02003-02-19 02:35:07 +000092
Skip Montanaro269b83b2001-02-06 01:07:02 +000093 import os2
94 __all__.extend(_get_exports_list(os2))
95 del os2
96
Guido van Rossum18df5d41999-06-11 01:37:27 +000097elif 'ce' in _names:
98 name = 'ce'
99 linesep = '\r\n'
Guido van Rossum18df5d41999-06-11 01:37:27 +0000100 from ce import *
Tim Peters6757c1e2003-01-08 21:20:57 +0000101 try:
102 from ce import _exit
Petri Lehtinen3bc37f22012-05-23 21:36:16 +0300103 __all__.append('_exit')
Tim Peters6757c1e2003-01-08 21:20:57 +0000104 except ImportError:
105 pass
Guido van Rossum18df5d41999-06-11 01:37:27 +0000106 # We can use the standard Windows path.
Skip Montanaro117910d2003-02-14 19:35:31 +0000107 import ntpath as path
Tim Petersf2715e02003-02-19 02:35:07 +0000108
Skip Montanaro269b83b2001-02-06 01:07:02 +0000109 import ce
110 __all__.extend(_get_exports_list(ce))
111 del ce
112
Guido van Rossum2979b011994-08-01 11:18:30 +0000113else:
Collin Winter828f04a2007-08-31 00:04:24 +0000114 raise ImportError('no os specific module found')
Guido van Rossume65cce51993-11-08 15:05:21 +0000115
Skip Montanaro117910d2003-02-14 19:35:31 +0000116sys.modules['os.path'] = path
Georg Brandled5b9b32008-12-05 07:45:54 +0000117from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep,
118 devnull)
Skip Montanaro269b83b2001-02-06 01:07:02 +0000119
Guido van Rossuma28dab51997-08-29 22:36:47 +0000120del _names
121
Martin v. Löwis22b457e2005-01-16 08:40:58 +0000122# Python uses fixed values for the SEEK_ constants; they are mapped
123# to native constants if necessary in posixmodule.c
124SEEK_SET = 0
125SEEK_CUR = 1
126SEEK_END = 2
127
Terry Reedy5a22b652010-12-02 07:05:56 +0000128
129def _get_masked_mode(mode):
130 mask = umask(0)
131 umask(mask)
132 return mode & ~mask
133
Guido van Rossum4def7de1998-07-24 20:48:03 +0000134# Super directory utilities.
135# (Inspired by Eric Raymond; the doc strings are mostly his)
136
Terry Reedy5a22b652010-12-02 07:05:56 +0000137def makedirs(name, mode=0o777, exist_ok=False):
138 """makedirs(path [, mode=0o777][, exist_ok=False])
Guido van Rossum4def7de1998-07-24 20:48:03 +0000139
140 Super-mkdir; create a leaf directory and all intermediate ones.
141 Works like mkdir, except that any intermediate path segment (not
Terry Reedy5a22b652010-12-02 07:05:56 +0000142 just the rightmost) will be created if it does not exist. If the
143 target directory with the same mode as we specified already exists,
144 raises an OSError if exist_ok is False, otherwise no exception is
145 raised. This is recursive.
Guido van Rossum4def7de1998-07-24 20:48:03 +0000146
147 """
148 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000149 if not tail:
150 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000151 if head and tail and not path.exists(head):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000152 try:
Terry Reedy5a22b652010-12-02 07:05:56 +0000153 makedirs(head, mode, exist_ok)
Guido van Rossumb940e112007-01-10 16:19:56 +0000154 except OSError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000155 # be happy if someone already created the path
Christian Heimes45f9af32007-11-27 21:50:00 +0000156 if e.errno != errno.EEXIST:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000157 raise
Andrew M. Kuchling6fccc8a2003-12-23 16:33:28 +0000158 if tail == curdir: # xxx/newdir/. exists if xxx/newdir exists
159 return
Terry Reedy5a22b652010-12-02 07:05:56 +0000160 try:
161 mkdir(name, mode)
162 except OSError as e:
Terry Reedy5a22b652010-12-02 07:05:56 +0000163 if not (e.errno == errno.EEXIST and exist_ok and path.isdir(name) and
164 st.S_IMODE(lstat(name).st_mode) == _get_masked_mode(mode)):
165 raise
Guido van Rossum4def7de1998-07-24 20:48:03 +0000166
167def removedirs(name):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000168 """removedirs(path)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000169
Fredrik Lundh96c1c7a2005-11-12 15:55:04 +0000170 Super-rmdir; remove a leaf directory and all empty intermediate
Guido van Rossum4def7de1998-07-24 20:48:03 +0000171 ones. Works like rmdir except that, if the leaf directory is
172 successfully removed, directories corresponding to rightmost path
Tim Petersc4e09402003-04-25 07:11:48 +0000173 segments will be pruned away until either the whole path is
Guido van Rossum4def7de1998-07-24 20:48:03 +0000174 consumed or an error occurs. Errors during this latter phase are
175 ignored -- they generally mean that a directory was not empty.
176
177 """
178 rmdir(name)
179 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000180 if not tail:
181 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000182 while head and tail:
183 try:
184 rmdir(head)
185 except error:
186 break
187 head, tail = path.split(head)
188
189def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000190 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000191
192 Super-rename; create directories as necessary and delete any left
193 empty. Works like rename, except creation of any intermediate
194 directories needed to make the new pathname good is attempted
195 first. After the rename, directories corresponding to rightmost
196 path segments of the old name will be pruned way until either the
197 whole path is consumed or a nonempty directory is found.
198
199 Note: this function can fail with the new directory structure made
200 if you lack permissions needed to unlink the leaf directory or
201 file.
202
203 """
204 head, tail = path.split(new)
205 if head and tail and not path.exists(head):
206 makedirs(head)
207 rename(old, new)
208 head, tail = path.split(old)
209 if head and tail:
210 try:
211 removedirs(head)
212 except error:
213 pass
214
Skip Montanaro269b83b2001-02-06 01:07:02 +0000215__all__.extend(["makedirs", "removedirs", "renames"])
216
Guido van Rossumd8faa362007-04-27 19:54:29 +0000217def walk(top, topdown=True, onerror=None, followlinks=False):
Tim Petersc4e09402003-04-25 07:11:48 +0000218 """Directory tree generator.
219
220 For each directory in the directory tree rooted at top (including top
221 itself, but excluding '.' and '..'), yields a 3-tuple
222
223 dirpath, dirnames, filenames
224
225 dirpath is a string, the path to the directory. dirnames is a list of
226 the names of the subdirectories in dirpath (excluding '.' and '..').
227 filenames is a list of the names of the non-directory files in dirpath.
228 Note that the names in the lists are just names, with no path components.
229 To get a full path (which begins with top) to a file or directory in
230 dirpath, do os.path.join(dirpath, name).
231
232 If optional arg 'topdown' is true or not specified, the triple for a
233 directory is generated before the triples for any of its subdirectories
234 (directories are generated top down). If topdown is false, the triple
235 for a directory is generated after the triples for all of its
236 subdirectories (directories are generated bottom up).
237
238 When topdown is true, the caller can modify the dirnames list in-place
239 (e.g., via del or slice assignment), and walk will only recurse into the
240 subdirectories whose names remain in dirnames; this can be used to prune
241 the search, or to impose a specific order of visiting. Modifying
242 dirnames when topdown is false is ineffective, since the directories in
243 dirnames have already been generated by the time dirnames itself is
244 generated.
245
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000246 By default errors from the os.listdir() call are ignored. If
247 optional arg 'onerror' is specified, it should be a function; it
248 will be called with one argument, an os.error instance. It can
249 report the error to continue with the walk, or raise the exception
250 to abort the walk. Note that the filename is available as the
251 filename attribute of the exception object.
252
Guido van Rossumd8faa362007-04-27 19:54:29 +0000253 By default, os.walk does not follow symbolic links to subdirectories on
254 systems that support them. In order to get this functionality, set the
255 optional argument 'followlinks' to true.
256
Tim Petersc4e09402003-04-25 07:11:48 +0000257 Caution: if you pass a relative pathname for top, don't change the
258 current working directory between resumptions of walk. walk never
259 changes the current directory, and assumes that the client doesn't
260 either.
261
262 Example:
263
Christian Heimes5d8da202008-05-06 13:58:24 +0000264 import os
Tim Petersc4e09402003-04-25 07:11:48 +0000265 from os.path import join, getsize
Christian Heimes5d8da202008-05-06 13:58:24 +0000266 for root, dirs, files in os.walk('python/Lib/email'):
Neal Norwitz752abd02008-05-13 04:55:24 +0000267 print(root, "consumes", end="")
268 print(sum([getsize(join(root, name)) for name in files]), end="")
269 print("bytes in", len(files), "non-directory files")
Tim Petersc4e09402003-04-25 07:11:48 +0000270 if 'CVS' in dirs:
271 dirs.remove('CVS') # don't visit CVS directories
272 """
273
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000274 islink, join, isdir = path.islink, path.join, path.isdir
Tim Petersc4e09402003-04-25 07:11:48 +0000275
276 # We may not have read permission for top, in which case we can't
Alexandre Vassalotti4e6531e2008-05-09 20:00:17 +0000277 # get a list of the files the directory contains. os.walk
Tim Petersc4e09402003-04-25 07:11:48 +0000278 # always suppressed the exception then, rather than blow up for a
279 # minor reason when (say) a thousand readable directories are still
280 # left to visit. That logic is copied here.
281 try:
282 # Note that listdir and error are globals in this module due
283 # to earlier import-*.
284 names = listdir(top)
Guido van Rossumb940e112007-01-10 16:19:56 +0000285 except error as err:
Guido van Rossumbf1bef82003-05-13 18:01:19 +0000286 if onerror is not None:
287 onerror(err)
Tim Petersc4e09402003-04-25 07:11:48 +0000288 return
289
290 dirs, nondirs = [], []
291 for name in names:
292 if isdir(join(top, name)):
293 dirs.append(name)
294 else:
295 nondirs.append(name)
296
297 if topdown:
298 yield top, dirs, nondirs
299 for name in dirs:
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000300 new_path = join(top, name)
301 if followlinks or not islink(new_path):
Benjamin Peterson569d0872012-05-10 16:17:35 -0500302 yield from walk(new_path, topdown, onerror, followlinks)
Tim Petersc4e09402003-04-25 07:11:48 +0000303 if not topdown:
304 yield top, dirs, nondirs
305
306__all__.append("walk")
307
Charles-François Natali7372b062012-02-05 15:15:38 +0100308if _exists("openat"):
309
310 def fwalk(top, topdown=True, onerror=None, followlinks=False):
311 """Directory tree generator.
312
313 This behaves exactly like walk(), except that it yields a 4-tuple
314
315 dirpath, dirnames, filenames, dirfd
316
317 `dirpath`, `dirnames` and `filenames` are identical to walk() output,
318 and `dirfd` is a file descriptor referring to the directory `dirpath`.
319
320 The advantage of walkfd() over walk() is that it's safe against symlink
321 races (when followlinks is False).
322
323 Caution:
324 Since fwalk() yields file descriptors, those are only valid until the
325 next iteration step, so you should dup() them if you want to keep them
326 for a longer period.
327
328 Example:
329
330 import os
331 for root, dirs, files, rootfd in os.fwalk('python/Lib/email'):
332 print(root, "consumes", end="")
333 print(sum([os.fstatat(rootfd, name).st_size for name in files]),
334 end="")
335 print("bytes in", len(files), "non-directory files")
336 if 'CVS' in dirs:
337 dirs.remove('CVS') # don't visit CVS directories
338 """
339 # Note: To guard against symlink races, we use the standard
340 # lstat()/open()/fstat() trick.
341 orig_st = lstat(top)
342 topfd = open(top, O_RDONLY)
343 try:
344 if (followlinks or (st.S_ISDIR(orig_st.st_mode) and
Charles-François Natali84c0ca02012-04-22 15:55:43 +0200345 path.samestat(orig_st, fstat(topfd)))):
Benjamin Peterson569d0872012-05-10 16:17:35 -0500346 yield from _fwalk(topfd, top, topdown, onerror, followlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100347 finally:
348 close(topfd)
349
350 def _fwalk(topfd, toppath, topdown, onerror, followlinks):
351 # Note: This uses O(depth of the directory tree) file descriptors: if
352 # necessary, it can be adapted to only require O(1) FDs, see issue
353 # #13734.
354
355 # whether to follow symlinks
356 flag = 0 if followlinks else AT_SYMLINK_NOFOLLOW
357
Charles-François Natali77940902012-02-06 19:54:48 +0100358 names = flistdir(topfd)
Charles-François Natali7372b062012-02-05 15:15:38 +0100359 dirs, nondirs = [], []
360 for name in names:
Hynek Schlawack66bfcc12012-05-15 16:32:21 +0200361 try:
362 # Here, we don't use AT_SYMLINK_NOFOLLOW to be consistent with
363 # walk() which reports symlinks to directories as directories.
364 # We do however check for symlinks before recursing into
365 # a subdirectory.
366 if st.S_ISDIR(fstatat(topfd, name).st_mode):
367 dirs.append(name)
368 else:
369 nondirs.append(name)
370 except FileNotFoundError:
371 try:
372 # Add dangling symlinks, ignore disappeared files
373 if st.S_ISLNK(fstatat(topfd, name, AT_SYMLINK_NOFOLLOW)
374 .st_mode):
375 nondirs.append(name)
376 except FileNotFoundError:
377 continue
Charles-François Natali7372b062012-02-05 15:15:38 +0100378
379 if topdown:
380 yield toppath, dirs, nondirs, topfd
381
382 for name in dirs:
383 try:
384 orig_st = fstatat(topfd, name, flag)
385 dirfd = openat(topfd, name, O_RDONLY)
386 except error as err:
387 if onerror is not None:
388 onerror(err)
389 return
390 try:
Charles-François Natali84c0ca02012-04-22 15:55:43 +0200391 if followlinks or path.samestat(orig_st, fstat(dirfd)):
Charles-François Natali7372b062012-02-05 15:15:38 +0100392 dirpath = path.join(toppath, name)
Benjamin Peterson569d0872012-05-10 16:17:35 -0500393 yield from _fwalk(dirfd, dirpath, topdown, onerror, followlinks)
Charles-François Natali7372b062012-02-05 15:15:38 +0100394 finally:
395 close(dirfd)
396
397 if not topdown:
398 yield toppath, dirs, nondirs, topfd
399
400 __all__.append("fwalk")
401
Guido van Rossuma28dab51997-08-29 22:36:47 +0000402# Make sure os.environ exists, at least
403try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000404 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000405except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000406 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000407
Guido van Rossume65cce51993-11-08 15:05:21 +0000408def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000409 """execl(file, *args)
410
411 Execute the executable file with argument list args, replacing the
412 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000413 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000414
415def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000416 """execle(file, *args, env)
417
418 Execute the executable file with argument list args and
419 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000420 env = args[-1]
421 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000422
423def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000424 """execlp(file, *args)
425
426 Execute the executable file (which is searched for along $PATH)
427 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000428 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000429
Guido van Rossum030afb11995-03-14 17:27:18 +0000430def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000431 """execlpe(file, *args, env)
432
433 Execute the executable file (which is searched for along $PATH)
434 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000435 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000436 env = args[-1]
437 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000438
Guido van Rossume65cce51993-11-08 15:05:21 +0000439def execvp(file, args):
Matthias Klosea09c54f2010-01-31 16:48:44 +0000440 """execvp(file, args)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000441
442 Execute the executable file (which is searched for along $PATH)
443 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000444 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000445 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000446
447def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000448 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000449
450 Execute the executable file (which is searched for along $PATH)
451 with argument list args and environment env , replacing the
452 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000453 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000454 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000455
Skip Montanaro269b83b2001-02-06 01:07:02 +0000456__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
457
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000458def _execvpe(file, args, env=None):
459 if env is not None:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000460 exec_func = execve
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000461 argrest = (args, env)
462 else:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000463 exec_func = execv
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000464 argrest = (args,)
465 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000466
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000467 head, tail = path.split(file)
468 if head:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000469 exec_func(file, *argrest)
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000470 return
Guido van Rossume7ba4952007-06-06 23:52:48 +0000471 last_exc = saved_exc = None
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000472 saved_tb = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000473 path_list = get_exec_path(env)
474 if name != 'nt':
475 file = fsencode(file)
476 path_list = map(fsencode, path_list)
477 for dir in path_list:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000478 fullname = path.join(dir, file)
479 try:
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000480 exec_func(fullname, *argrest)
Guido van Rossumb940e112007-01-10 16:19:56 +0000481 except error as e:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000482 last_exc = e
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000483 tb = sys.exc_info()[2]
Christian Heimes45f9af32007-11-27 21:50:00 +0000484 if (e.errno != errno.ENOENT and e.errno != errno.ENOTDIR
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000485 and saved_exc is None):
486 saved_exc = e
487 saved_tb = tb
488 if saved_exc:
Benjamin Peterson4b068192009-02-20 03:19:25 +0000489 raise saved_exc.with_traceback(saved_tb)
490 raise last_exc.with_traceback(tb)
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000491
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000492
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000493def get_exec_path(env=None):
494 """Returns the sequence of directories that will be searched for the
495 named executable (similar to a shell) when launching a process.
496
497 *env* must be an environment variable dict or None. If *env* is None,
498 os.environ will be used.
499 """
Victor Stinner273b7662010-11-06 12:59:33 +0000500 # Use a local import instead of a global import to limit the number of
501 # modules loaded at startup: the os module is always loaded at startup by
502 # Python. It may also avoid a bootstrap issue.
Victor Stinner6f35eda2010-10-29 00:38:58 +0000503 import warnings
504
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000505 if env is None:
506 env = environ
Victor Stinnerb745a742010-05-18 17:17:23 +0000507
Victor Stinnerbb4f2182010-11-07 15:43:39 +0000508 # {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a
509 # BytesWarning when using python -b or python -bb: ignore the warning
Victor Stinner273b7662010-11-06 12:59:33 +0000510 with warnings.catch_warnings():
511 warnings.simplefilter("ignore", BytesWarning)
Victor Stinnerb745a742010-05-18 17:17:23 +0000512
Victor Stinnerb745a742010-05-18 17:17:23 +0000513 try:
Victor Stinner273b7662010-11-06 12:59:33 +0000514 path_list = env.get('PATH')
515 except TypeError:
516 path_list = None
Victor Stinnerb745a742010-05-18 17:17:23 +0000517
Victor Stinner273b7662010-11-06 12:59:33 +0000518 if supports_bytes_environ:
519 try:
520 path_listb = env[b'PATH']
521 except (KeyError, TypeError):
522 pass
523 else:
524 if path_list is not None:
525 raise ValueError(
526 "env cannot contain 'PATH' and b'PATH' keys")
527 path_list = path_listb
528
529 if path_list is not None and isinstance(path_list, bytes):
530 path_list = fsdecode(path_list)
Victor Stinnerb745a742010-05-18 17:17:23 +0000531
532 if path_list is None:
533 path_list = defpath
534 return path_list.split(pathsep)
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000535
536
Skip Montanaro289bc052007-08-17 02:30:27 +0000537# Change environ to automatically call putenv(), unsetenv if they exist.
Raymond Hettinger158c9c22011-02-22 00:41:50 +0000538from collections.abc import MutableMapping
Skip Montanaro289bc052007-08-17 02:30:27 +0000539
540class _Environ(MutableMapping):
Victor Stinner84ae1182010-05-06 22:05:07 +0000541 def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv):
542 self.encodekey = encodekey
543 self.decodekey = decodekey
544 self.encodevalue = encodevalue
545 self.decodevalue = decodevalue
Skip Montanaro289bc052007-08-17 02:30:27 +0000546 self.putenv = putenv
547 self.unsetenv = unsetenv
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000548 self._data = data
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000549
Skip Montanaro289bc052007-08-17 02:30:27 +0000550 def __getitem__(self, key):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000551 value = self._data[self.encodekey(key)]
Victor Stinner84ae1182010-05-06 22:05:07 +0000552 return self.decodevalue(value)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000553
Skip Montanaro289bc052007-08-17 02:30:27 +0000554 def __setitem__(self, key, value):
Victor Stinner84ae1182010-05-06 22:05:07 +0000555 key = self.encodekey(key)
556 value = self.encodevalue(value)
Skip Montanaro289bc052007-08-17 02:30:27 +0000557 self.putenv(key, value)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000558 self._data[key] = value
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000559
Skip Montanaro289bc052007-08-17 02:30:27 +0000560 def __delitem__(self, key):
Victor Stinner84ae1182010-05-06 22:05:07 +0000561 key = self.encodekey(key)
Skip Montanaro289bc052007-08-17 02:30:27 +0000562 self.unsetenv(key)
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000563 del self._data[key]
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000564
Skip Montanaro289bc052007-08-17 02:30:27 +0000565 def __iter__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000566 for key in self._data:
Victor Stinner84ae1182010-05-06 22:05:07 +0000567 yield self.decodekey(key)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000568
Skip Montanaro289bc052007-08-17 02:30:27 +0000569 def __len__(self):
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000570 return len(self._data)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000571
572 def __repr__(self):
Victor Stinnerbed71172010-07-28 21:25:42 +0000573 return 'environ({{{}}})'.format(', '.join(
Victor Stinnerd73c1a32010-07-28 21:23:23 +0000574 ('{!r}: {!r}'.format(self.decodekey(key), self.decodevalue(value))
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000575 for key, value in self._data.items())))
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000576
Skip Montanaro289bc052007-08-17 02:30:27 +0000577 def copy(self):
578 return dict(self)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000579
Skip Montanaro289bc052007-08-17 02:30:27 +0000580 def setdefault(self, key, value):
581 if key not in self:
582 self[key] = value
583 return self[key]
584
585try:
586 _putenv = putenv
587except NameError:
588 _putenv = lambda key, value: None
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000589else:
Skip Montanaro289bc052007-08-17 02:30:27 +0000590 __all__.append("putenv")
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000591
Skip Montanaro289bc052007-08-17 02:30:27 +0000592try:
593 _unsetenv = unsetenv
594except NameError:
595 _unsetenv = lambda key: _putenv(key, "")
596else:
597 __all__.append("unsetenv")
Guido van Rossumc524d952001-10-19 01:31:59 +0000598
Victor Stinner84ae1182010-05-06 22:05:07 +0000599def _createenviron():
600 if name in ('os2', 'nt'):
601 # Where Env Var Names Must Be UPPERCASE
602 def check_str(value):
603 if not isinstance(value, str):
604 raise TypeError("str expected, not %s" % type(value).__name__)
605 return value
606 encode = check_str
607 decode = str
608 def encodekey(key):
609 return encode(key).upper()
610 data = {}
611 for key, value in environ.items():
612 data[encodekey(key)] = value
613 else:
614 # Where Env Var Names Can Be Mixed Case
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000615 encoding = sys.getfilesystemencoding()
Victor Stinner84ae1182010-05-06 22:05:07 +0000616 def encode(value):
617 if not isinstance(value, str):
618 raise TypeError("str expected, not %s" % type(value).__name__)
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000619 return value.encode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000620 def decode(value):
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000621 return value.decode(encoding, 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000622 encodekey = encode
623 data = environ
624 return _Environ(data,
625 encodekey, decode,
626 encode, decode,
627 _putenv, _unsetenv)
Guido van Rossumc524d952001-10-19 01:31:59 +0000628
Victor Stinner84ae1182010-05-06 22:05:07 +0000629# unicode environ
630environ = _createenviron()
631del _createenviron
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000632
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000633
Jack Jansenb11ce9b2003-01-08 16:33:40 +0000634def getenv(key, default=None):
Tim Peters2c60f7a2003-01-29 03:49:43 +0000635 """Get an environment variable, return None if it doesn't exist.
Victor Stinner84ae1182010-05-06 22:05:07 +0000636 The optional second argument can specify an alternate default.
637 key, default and the result are str."""
Tim Peters2c60f7a2003-01-29 03:49:43 +0000638 return environ.get(key, default)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000639
Victor Stinnerb745a742010-05-18 17:17:23 +0000640supports_bytes_environ = name not in ('os2', 'nt')
641__all__.extend(("getenv", "supports_bytes_environ"))
642
643if supports_bytes_environ:
Victor Stinner84ae1182010-05-06 22:05:07 +0000644 def _check_bytes(value):
645 if not isinstance(value, bytes):
646 raise TypeError("bytes expected, not %s" % type(value).__name__)
647 return value
648
649 # bytes environ
Victor Stinner3d75d0c2010-09-10 22:18:16 +0000650 environb = _Environ(environ._data,
Victor Stinner84ae1182010-05-06 22:05:07 +0000651 _check_bytes, bytes,
652 _check_bytes, bytes,
653 _putenv, _unsetenv)
654 del _check_bytes
655
656 def getenvb(key, default=None):
657 """Get an environment variable, return None if it doesn't exist.
658 The optional second argument can specify an alternate default.
659 key, default and the result are bytes."""
660 return environb.get(key, default)
Victor Stinner70120e22010-07-29 17:19:38 +0000661
662 __all__.extend(("environb", "getenvb"))
Victor Stinner84ae1182010-05-06 22:05:07 +0000663
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000664def _fscodec():
665 encoding = sys.getfilesystemencoding()
666 if encoding == 'mbcs':
Victor Stinnere882aac2010-10-24 21:12:26 +0000667 errors = 'strict'
Victor Stinner313a1202010-06-11 23:56:51 +0000668 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000669 errors = 'surrogateescape'
Victor Stinnere8d51452010-08-19 01:05:19 +0000670
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000671 def fsencode(filename):
672 """
673 Encode filename to the filesystem encoding with 'surrogateescape' error
674 handler, return bytes unchanged. On Windows, use 'strict' error handler if
675 the file system encoding is 'mbcs' (which is the default encoding).
676 """
677 if isinstance(filename, bytes):
678 return filename
679 elif isinstance(filename, str):
680 return filename.encode(encoding, errors)
Victor Stinnere8d51452010-08-19 01:05:19 +0000681 else:
Victor Stinnerdf6d6cb2010-10-24 20:32:26 +0000682 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
683
684 def fsdecode(filename):
685 """
686 Decode filename from the filesystem encoding with 'surrogateescape' error
687 handler, return str unchanged. On Windows, use 'strict' error handler if
688 the file system encoding is 'mbcs' (which is the default encoding).
689 """
690 if isinstance(filename, str):
691 return filename
692 elif isinstance(filename, bytes):
693 return filename.decode(encoding, errors)
694 else:
695 raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
696
697 return fsencode, fsdecode
698
699fsencode, fsdecode = _fscodec()
700del _fscodec
Victor Stinner449c4662010-05-08 11:10:09 +0000701
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000702# Supply spawn*() (probably only for Unix)
703if _exists("fork") and not _exists("spawnv") and _exists("execv"):
704
705 P_WAIT = 0
706 P_NOWAIT = P_NOWAITO = 1
707
Petri Lehtinen3bc37f22012-05-23 21:36:16 +0300708 __all__.extend(["P_WAIT", "P_NOWAIT", "P_NOWAITO"])
709
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000710 # XXX Should we support P_DETACH? I suppose it could fork()**2
711 # and close the std I/O streams. Also, P_OVERLAY is the same
712 # as execv*()?
713
714 def _spawnvef(mode, file, args, env, func):
715 # Internal helper; func is the exec*() function to use
716 pid = fork()
717 if not pid:
718 # Child
719 try:
720 if env is None:
721 func(file, args)
722 else:
723 func(file, args, env)
724 except:
725 _exit(127)
726 else:
727 # Parent
728 if mode == P_NOWAIT:
729 return pid # Caller is responsible for waiting!
730 while 1:
731 wpid, sts = waitpid(pid, 0)
732 if WIFSTOPPED(sts):
733 continue
734 elif WIFSIGNALED(sts):
735 return -WTERMSIG(sts)
736 elif WIFEXITED(sts):
737 return WEXITSTATUS(sts)
738 else:
Collin Winter828f04a2007-08-31 00:04:24 +0000739 raise error("Not stopped, signaled or exited???")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000740
741 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000742 """spawnv(mode, file, args) -> integer
743
744Execute file with arguments from args in a subprocess.
745If mode == P_NOWAIT return the pid of the process.
746If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000747otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000748 return _spawnvef(mode, file, args, None, execv)
749
750 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000751 """spawnve(mode, file, args, env) -> integer
752
753Execute file with arguments from args in a subprocess with the
754specified environment.
755If mode == P_NOWAIT return the pid of the process.
756If mode == P_WAIT return the process's exit code if it exits normally;
757otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000758 return _spawnvef(mode, file, args, env, execve)
759
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000760 # Note: spawnvp[e] is't currently supported on Windows
761
762 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000763 """spawnvp(mode, file, args) -> integer
764
765Execute file (which is looked for along $PATH) with arguments from
766args in a subprocess.
767If mode == P_NOWAIT return the pid of the process.
768If mode == P_WAIT return the process's exit code if it exits normally;
769otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000770 return _spawnvef(mode, file, args, None, execvp)
771
772 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000773 """spawnvpe(mode, file, args, env) -> integer
774
775Execute file (which is looked for along $PATH) with arguments from
776args in a subprocess with the supplied environment.
777If mode == P_NOWAIT return the pid of the process.
778If mode == P_WAIT return the process's exit code if it exits normally;
779otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000780 return _spawnvef(mode, file, args, env, execvpe)
781
782if _exists("spawnv"):
783 # These aren't supplied by the basic Windows code
784 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000785
786 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000787 """spawnl(mode, file, *args) -> integer
788
789Execute file with arguments from args in a subprocess.
790If mode == P_NOWAIT return the pid of the process.
791If mode == P_WAIT return the process's exit code if it exits normally;
792otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000793 return spawnv(mode, file, args)
794
795 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000796 """spawnle(mode, file, *args, env) -> integer
797
798Execute file with arguments from args in a subprocess with the
799supplied environment.
800If mode == P_NOWAIT return the pid of the process.
801If mode == P_WAIT return the process's exit code if it exits normally;
802otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000803 env = args[-1]
804 return spawnve(mode, file, args[:-1], env)
805
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000806
807 __all__.extend(["spawnv", "spawnve", "spawnl", "spawnle",])
808
809
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000810if _exists("spawnvp"):
811 # At the moment, Windows doesn't implement spawnvp[e],
812 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000813 def spawnlp(mode, file, *args):
Neal Norwitzb7f68102003-07-02 02:49:33 +0000814 """spawnlp(mode, file, *args) -> integer
Guido van Rossume0cd2912000-04-21 18:35:36 +0000815
816Execute file (which is looked for along $PATH) with arguments from
817args in a subprocess with the supplied environment.
818If mode == P_NOWAIT return the pid of the process.
819If mode == P_WAIT return the process's exit code if it exits normally;
820otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000821 return spawnvp(mode, file, args)
822
823 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000824 """spawnlpe(mode, file, *args, env) -> integer
825
826Execute file (which is looked for along $PATH) with arguments from
827args in a subprocess with the supplied environment.
828If mode == P_NOWAIT return the pid of the process.
829If mode == P_WAIT return the process's exit code if it exits normally;
830otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000831 env = args[-1]
832 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000833
834
Andrew MacIntyre69e18c92004-04-04 07:11:43 +0000835 __all__.extend(["spawnvp", "spawnvpe", "spawnlp", "spawnlpe",])
Skip Montanaro269b83b2001-02-06 01:07:02 +0000836
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000837import copyreg as _copyreg
Michael W. Hudson0e025302002-03-06 17:11:18 +0000838
839def _make_stat_result(tup, dict):
840 return stat_result(tup, dict)
841
842def _pickle_stat_result(sr):
843 (type, args) = sr.__reduce__()
844 return (_make_stat_result, args)
845
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000846try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000847 _copyreg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000848except NameError: # stat_result may not exist
849 pass
Michael W. Hudson0e025302002-03-06 17:11:18 +0000850
851def _make_statvfs_result(tup, dict):
852 return statvfs_result(tup, dict)
853
854def _pickle_statvfs_result(sr):
855 (type, args) = sr.__reduce__()
856 return (_make_statvfs_result, args)
857
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000858try:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000859 _copyreg.pickle(statvfs_result, _pickle_statvfs_result,
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000860 _make_statvfs_result)
Michael W. Hudsone5363b72002-03-15 10:21:59 +0000861except NameError: # statvfs_result may not exist
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000862 pass
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000863
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000864# Supply os.popen()
Antoine Pitrou877766d2011-03-19 17:00:37 +0100865def popen(cmd, mode="r", buffering=-1):
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000866 if not isinstance(cmd, str):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000867 raise TypeError("invalid cmd type (%s, expected string)" % type(cmd))
868 if mode not in ("r", "w"):
869 raise ValueError("invalid mode %r" % mode)
Antoine Pitrou877766d2011-03-19 17:00:37 +0100870 if buffering == 0 or buffering == None:
871 raise ValueError("popen() does not support unbuffered streams")
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000872 import subprocess, io
873 if mode == "r":
874 proc = subprocess.Popen(cmd,
875 shell=True,
876 stdout=subprocess.PIPE,
877 bufsize=buffering)
878 return _wrap_close(io.TextIOWrapper(proc.stdout), proc)
879 else:
880 proc = subprocess.Popen(cmd,
881 shell=True,
882 stdin=subprocess.PIPE,
883 bufsize=buffering)
884 return _wrap_close(io.TextIOWrapper(proc.stdin), proc)
885
886# Helper for popen() -- a proxy for a file whose close waits for the process
887class _wrap_close:
888 def __init__(self, stream, proc):
889 self._stream = stream
890 self._proc = proc
891 def close(self):
892 self._stream.close()
Amaury Forgeot d'Arc97e5f282009-07-11 09:35:13 +0000893 returncode = self._proc.wait()
894 if returncode == 0:
895 return None
896 if name == 'nt':
897 return returncode
898 else:
899 return returncode << 8 # Shift left to match old behavior
Antoine Pitrouac625352009-12-09 00:01:27 +0000900 def __enter__(self):
901 return self
902 def __exit__(self, *args):
903 self.close()
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000904 def __getattr__(self, name):
905 return getattr(self._stream, name)
Thomas Heller476157b2007-09-04 11:27:47 +0000906 def __iter__(self):
907 return iter(self._stream)
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000908
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +0000909# Supply os.fdopen()
910def fdopen(fd, *args, **kwargs):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000911 if not isinstance(fd, int):
912 raise TypeError("invalid fd type (%s, expected integer)" % type(fd))
913 import io
Amaury Forgeot d'Arcbdbddf82008-08-01 00:06:49 +0000914 return io.open(fd, *args, **kwargs)