14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaor"""OS routines for Mac, NT, or Posix depending on what system we're on.
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoThis exports:
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  - all functions from posix, nt, os2, or ce, e.g. unlink, stat, etc.
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  - os.path is one of the modules posixpath, or ntpath
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  - os.name is 'posix', 'nt', 'os2', 'ce' or 'riscos'
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  - os.curdir is a string representing the current directory ('.' or ':')
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  - os.pardir is a string representing the parent directory ('..' or '::')
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  - os.sep is the (or a most common) pathname separator ('/' or ':' or '\\')
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  - os.extsep is the extension separator ('.' or '/')
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  - os.altsep is the alternate pathname separator (None or '/')
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  - os.pathsep is the component separator used in $PATH etc
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  - os.linesep is the line separator in text files ('\r' or '\n' or '\r\n')
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  - os.defpath is the default search path for executables
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  - os.devnull is the file path of the null device ('/dev/null', etc.)
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
174adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoPrograms that import and use 'os' stand a better chance of being
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoportable between different platforms.  Of course, they must then
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoonly use functions that are defined by all platforms (e.g., unlink
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoand opendir), and leave all pathname manipulation to os.path
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao(e.g., split and join).
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#'
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport sys, errno
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao_names = sys.builtin_module_names
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Note:  more names are added to __all__ later.
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__all__ = ["altsep", "curdir", "pardir", "sep", "extsep", "pathsep", "linesep",
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao           "defpath", "name", "path", "devnull",
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao           "SEEK_SET", "SEEK_CUR", "SEEK_END"]
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef _get_exports_list(module):
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    try:
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return list(module.__all__)
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    except AttributeError:
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return [n for n in dir(module) if n[0] != '_']
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif 'posix' in _names:
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    name = 'posix'
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    linesep = '\n'
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from posix import *
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    try:
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from posix import _exit
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    except ImportError:
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pass
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import posixpath as path
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import posix
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    __all__.extend(_get_exports_list(posix))
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    del posix
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoelif 'nt' in _names:
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    name = 'nt'
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    linesep = '\r\n'
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from nt import *
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    try:
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from nt import _exit
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    except ImportError:
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pass
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import ntpath as path
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import nt
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    __all__.extend(_get_exports_list(nt))
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    del nt
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoelif 'os2' in _names:
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    name = 'os2'
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    linesep = '\r\n'
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from os2 import *
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    try:
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from os2 import _exit
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    except ImportError:
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pass
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if sys.version.find('EMX GCC') == -1:
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        import ntpath as path
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    else:
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        import os2emxpath as path
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from _emx_link import link
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import os2
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    __all__.extend(_get_exports_list(os2))
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    del os2
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoelif 'ce' in _names:
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    name = 'ce'
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    linesep = '\r\n'
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from ce import *
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    try:
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from ce import _exit
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    except ImportError:
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pass
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # We can use the standard Windows path.
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import ntpath as path
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import ce
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    __all__.extend(_get_exports_list(ce))
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    del ce
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoelif 'riscos' in _names:
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    name = 'riscos'
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    linesep = '\n'
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from riscos import *
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    try:
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from riscos import _exit
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    except ImportError:
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pass
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import riscospath as path
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import riscos
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    __all__.extend(_get_exports_list(riscos))
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    del riscos
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoelse:
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    raise ImportError, 'no os specific module found'
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaosys.modules['os.path'] = path
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep,
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    devnull)
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodel _names
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Python uses fixed values for the SEEK_ constants; they are mapped
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# to native constants if necessary in posixmodule.c
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoSEEK_SET = 0
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoSEEK_CUR = 1
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoSEEK_END = 2
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#'
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Super directory utilities.
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# (Inspired by Eric Raymond; the doc strings are mostly his)
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef makedirs(name, mode=0777):
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """makedirs(path [, mode=0777])
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Super-mkdir; create a leaf directory and all intermediate ones.
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Works like mkdir, except that any intermediate path segment (not
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    just the rightmost) will be created if it does not exist.  This is
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    recursive.
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    head, tail = path.split(name)
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if not tail:
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        head, tail = path.split(head)
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if head and tail and not path.exists(head):
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            makedirs(head, mode)
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except OSError, e:
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # be happy if someone already created the path
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if e.errno != errno.EEXIST:
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if tail == curdir:           # xxx/newdir/. exists if xxx/newdir exists
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    mkdir(name, mode)
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef removedirs(name):
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """removedirs(path)
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Super-rmdir; remove a leaf directory and all empty intermediate
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ones.  Works like rmdir except that, if the leaf directory is
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    successfully removed, directories corresponding to rightmost path
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    segments will be pruned away until either the whole path is
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    consumed or an error occurs.  Errors during this latter phase are
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ignored -- they generally mean that a directory was not empty.
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    rmdir(name)
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    head, tail = path.split(name)
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if not tail:
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        head, tail = path.split(head)
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    while head and tail:
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            rmdir(head)
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except error:
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            break
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        head, tail = path.split(head)
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef renames(old, new):
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """renames(old, new)
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Super-rename; create directories as necessary and delete any left
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    empty.  Works like rename, except creation of any intermediate
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    directories needed to make the new pathname good is attempted
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    first.  After the rename, directories corresponding to rightmost
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    path segments of the old name will be pruned way until either the
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    whole path is consumed or a nonempty directory is found.
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Note: this function can fail with the new directory structure made
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if you lack permissions needed to unlink the leaf directory or
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    file.
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    head, tail = path.split(new)
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if head and tail and not path.exists(head):
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        makedirs(head)
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    rename(old, new)
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    head, tail = path.split(old)
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if head and tail:
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            removedirs(head)
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except error:
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__all__.extend(["makedirs", "removedirs", "renames"])
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef walk(top, topdown=True, onerror=None, followlinks=False):
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Directory tree generator.
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    For each directory in the directory tree rooted at top (including top
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    itself, but excluding '.' and '..'), yields a 3-tuple
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dirpath, dirnames, filenames
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dirpath is a string, the path to the directory.  dirnames is a list of
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    the names of the subdirectories in dirpath (excluding '.' and '..').
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    filenames is a list of the names of the non-directory files in dirpath.
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Note that the names in the lists are just names, with no path components.
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    To get a full path (which begins with top) to a file or directory in
2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dirpath, do os.path.join(dirpath, name).
2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    If optional arg 'topdown' is true or not specified, the triple for a
2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    directory is generated before the triples for any of its subdirectories
2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (directories are generated top down).  If topdown is false, the triple
2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for a directory is generated after the triples for all of its
2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    subdirectories (directories are generated bottom up).
2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    When topdown is true, the caller can modify the dirnames list in-place
2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (e.g., via del or slice assignment), and walk will only recurse into the
2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    subdirectories whose names remain in dirnames; this can be used to prune
2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    the search, or to impose a specific order of visiting.  Modifying
2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dirnames when topdown is false is ineffective, since the directories in
2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dirnames have already been generated by the time dirnames itself is
2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    generated.
2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    By default errors from the os.listdir() call are ignored.  If
2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    optional arg 'onerror' is specified, it should be a function; it
2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    will be called with one argument, an os.error instance.  It can
2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    report the error to continue with the walk, or raise the exception
2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    to abort the walk.  Note that the filename is available as the
2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    filename attribute of the exception object.
2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    By default, os.walk does not follow symbolic links to subdirectories on
2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    systems that support them.  In order to get this functionality, set the
2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    optional argument 'followlinks' to true.
2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Caution:  if you pass a relative pathname for top, don't change the
2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    current working directory between resumptions of walk.  walk never
2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    changes the current directory, and assumes that the client doesn't
2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    either.
2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Example:
2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import os
2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from os.path import join, getsize
2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for root, dirs, files in os.walk('python/Lib/email'):
2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print root, "consumes",
2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print sum([getsize(join(root, name)) for name in files]),
2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print "bytes in", len(files), "non-directory files"
2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if 'CVS' in dirs:
2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            dirs.remove('CVS')  # don't visit CVS directories
2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    islink, join, isdir = path.islink, path.join, path.isdir
2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # We may not have read permission for top, in which case we can't
2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # get a list of the files the directory contains.  os.path.walk
2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # always suppressed the exception then, rather than blow up for a
2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # minor reason when (say) a thousand readable directories are still
2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # left to visit.  That logic is copied here.
2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    try:
2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Note that listdir and error are globals in this module due
2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # to earlier import-*.
2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        names = listdir(top)
2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    except error, err:
2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if onerror is not None:
2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            onerror(err)
2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return
2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dirs, nondirs = [], []
2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for name in names:
2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if isdir(join(top, name)):
2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            dirs.append(name)
2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            nondirs.append(name)
2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if topdown:
2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        yield top, dirs, nondirs
2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for name in dirs:
2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        new_path = join(top, name)
2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if followlinks or not islink(new_path):
2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for x in walk(new_path, topdown, onerror, followlinks):
2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                yield x
2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if not topdown:
2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        yield top, dirs, nondirs
2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__all__.append("walk")
3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Make sure os.environ exists, at least
3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotry:
3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    environ
3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoexcept NameError:
3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    environ = {}
3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef execl(file, *args):
3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """execl(file, *args)
3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Execute the executable file with argument list args, replacing the
3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    current process. """
3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    execv(file, args)
3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef execle(file, *args):
3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """execle(file, *args, env)
3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Execute the executable file with argument list args and
3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    environment env, replacing the current process. """
3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    env = args[-1]
3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    execve(file, args[:-1], env)
3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef execlp(file, *args):
3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """execlp(file, *args)
3244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Execute the executable file (which is searched for along $PATH)
3264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    with argument list args, replacing the current process. """
3274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    execvp(file, args)
3284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef execlpe(file, *args):
3304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """execlpe(file, *args, env)
3314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Execute the executable file (which is searched for along $PATH)
3334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    with argument list args and environment env, replacing the current
3344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    process. """
3354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    env = args[-1]
3364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    execvpe(file, args[:-1], env)
3374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef execvp(file, args):
3394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """execvp(file, args)
3404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Execute the executable file (which is searched for along $PATH)
3424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    with argument list args, replacing the current process.
3434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    args may be a list or tuple of strings. """
3444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _execvpe(file, args)
3454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef execvpe(file, args, env):
3474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """execvpe(file, args, env)
3484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Execute the executable file (which is searched for along $PATH)
3504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    with argument list args and environment env , replacing the
3514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    current process.
3524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    args may be a list or tuple of strings. """
3534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _execvpe(file, args, env)
3544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
3564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef _execvpe(file, args, env=None):
3584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if env is not None:
3594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        func = execve
3604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        argrest = (args, env)
3614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    else:
3624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        func = execv
3634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        argrest = (args,)
3644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        env = environ
3654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    head, tail = path.split(file)
3674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if head:
3684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        func(file, *argrest)
3694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return
3704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if 'PATH' in env:
3714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        envpath = env['PATH']
3724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    else:
3734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        envpath = defpath
3744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    PATH = envpath.split(pathsep)
3754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    saved_exc = None
3764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    saved_tb = None
3774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for dir in PATH:
3784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        fullname = path.join(dir, file)
3794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
3804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            func(fullname, *argrest)
3814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except error, e:
3824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            tb = sys.exc_info()[2]
3834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if (e.errno != errno.ENOENT and e.errno != errno.ENOTDIR
3844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                and saved_exc is None):
3854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                saved_exc = e
3864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                saved_tb = tb
3874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if saved_exc:
3884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise error, saved_exc, saved_tb
3894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    raise error, e, tb
3904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Change environ to automatically call putenv() if it exists
3924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotry:
3934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # This will fail if there's no putenv
3944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    putenv
3954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoexcept NameError:
3964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
3974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoelse:
3984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import UserDict
3994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Fake unsetenv() for Windows
4014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # not sure about os2 here but
4024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # I'm guessing they are the same.
4034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if name in ('os2', 'nt'):
4054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def unsetenv(key):
4064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            putenv(key, "")
4074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if name == "riscos":
4094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # On RISC OS, all env access goes through getenv and putenv
4104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from riscosenviron import _Environ
4114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    elif name in ('os2', 'nt'):  # Where Env Var Names Must Be UPPERCASE
4124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # But we store them as upper case
4134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class _Environ(UserDict.IterableUserDict):
4144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __init__(self, environ):
4154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                UserDict.UserDict.__init__(self)
4164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                data = self.data
4174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                for k, v in environ.items():
4184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    data[k.upper()] = v
4194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __setitem__(self, key, item):
4204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                putenv(key, item)
4214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.data[key.upper()] = item
4224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __getitem__(self, key):
4234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return self.data[key.upper()]
4244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
4254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                unsetenv
4264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except NameError:
4274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                def __delitem__(self, key):
4284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    del self.data[key.upper()]
4294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
4304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                def __delitem__(self, key):
4314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    unsetenv(key)
4324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    del self.data[key.upper()]
4334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                def clear(self):
4344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    for key in self.data.keys():
4354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        unsetenv(key)
4364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        del self.data[key]
4374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                def pop(self, key, *args):
4384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    unsetenv(key)
4394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    return self.data.pop(key.upper(), *args)
4404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def has_key(self, key):
4414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return key.upper() in self.data
4424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __contains__(self, key):
4434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return key.upper() in self.data
4444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def get(self, key, failobj=None):
4454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return self.data.get(key.upper(), failobj)
4464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def update(self, dict=None, **kwargs):
4474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if dict:
4484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    try:
4494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        keys = dict.keys()
4504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    except AttributeError:
4514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # List of (key, value)
4524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        for k, v in dict:
4534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            self[k] = v
4544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    else:
4554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # got keys
4564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # cannot use items(), since mappings
4574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # may not have them.
4584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        for k in keys:
4594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            self[k] = dict[k]
4604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if kwargs:
4614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.update(kwargs)
4624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def copy(self):
4634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return dict(self)
4644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    else:  # Where Env Var Names Can Be Mixed Case
4664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class _Environ(UserDict.IterableUserDict):
4674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __init__(self, environ):
4684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                UserDict.UserDict.__init__(self)
4694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.data = environ
4704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __setitem__(self, key, item):
4714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                putenv(key, item)
4724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.data[key] = item
4734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def update(self,  dict=None, **kwargs):
4744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if dict:
4754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    try:
4764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        keys = dict.keys()
4774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    except AttributeError:
4784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # List of (key, value)
4794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        for k, v in dict:
4804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            self[k] = v
4814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    else:
4824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # got keys
4834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # cannot use items(), since mappings
4844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # may not have them.
4854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        for k in keys:
4864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            self[k] = dict[k]
4874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if kwargs:
4884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.update(kwargs)
4894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
4904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                unsetenv
4914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except NameError:
4924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
4934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
4944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                def __delitem__(self, key):
4954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    unsetenv(key)
4964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    del self.data[key]
4974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                def clear(self):
4984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    for key in self.data.keys():
4994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        unsetenv(key)
5004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        del self.data[key]
5014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                def pop(self, key, *args):
5024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    unsetenv(key)
5034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    return self.data.pop(key, *args)
5044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def copy(self):
5054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return dict(self)
5064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    environ = _Environ(environ)
5094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef getenv(key, default=None):
5114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Get an environment variable, return None if it doesn't exist.
5124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    The optional second argument can specify an alternate default."""
5134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return environ.get(key, default)
5144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__all__.append("getenv")
5154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef _exists(name):
5174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return name in globals()
5184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Supply spawn*() (probably only for Unix)
5204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif _exists("fork") and not _exists("spawnv") and _exists("execv"):
5214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    P_WAIT = 0
5234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    P_NOWAIT = P_NOWAITO = 1
5244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # XXX Should we support P_DETACH?  I suppose it could fork()**2
5264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # and close the std I/O streams.  Also, P_OVERLAY is the same
5274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # as execv*()?
5284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _spawnvef(mode, file, args, env, func):
5304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Internal helper; func is the exec*() function to use
5314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pid = fork()
5324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not pid:
5334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Child
5344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
5354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if env is None:
5364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    func(file, args)
5374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                else:
5384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    func(file, args, env)
5394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except:
5404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                _exit(127)
5414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
5424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Parent
5434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if mode == P_NOWAIT:
5444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return pid # Caller is responsible for waiting!
5454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            while 1:
5464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                wpid, sts = waitpid(pid, 0)
5474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if WIFSTOPPED(sts):
5484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    continue
5494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                elif WIFSIGNALED(sts):
5504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    return -WTERMSIG(sts)
5514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                elif WIFEXITED(sts):
5524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    return WEXITSTATUS(sts)
5534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                else:
5544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    raise error, "Not stopped, signaled or exited???"
5554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def spawnv(mode, file, args):
5574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """spawnv(mode, file, args) -> integer
5584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5594adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoExecute file with arguments from args in a subprocess.
5604adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoIf mode == P_NOWAIT return the pid of the process.
5614adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoIf mode == P_WAIT return the process's exit code if it exits normally;
5624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaootherwise return -SIG, where SIG is the signal that killed it. """
5634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return _spawnvef(mode, file, args, None, execv)
5644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def spawnve(mode, file, args, env):
5664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """spawnve(mode, file, args, env) -> integer
5674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5684adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoExecute file with arguments from args in a subprocess with the
5694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaospecified environment.
5704adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoIf mode == P_NOWAIT return the pid of the process.
5714adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoIf mode == P_WAIT return the process's exit code if it exits normally;
5724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaootherwise return -SIG, where SIG is the signal that killed it. """
5734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return _spawnvef(mode, file, args, env, execve)
5744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Note: spawnvp[e] is't currently supported on Windows
5764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def spawnvp(mode, file, args):
5784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """spawnvp(mode, file, args) -> integer
5794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5804adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoExecute file (which is looked for along $PATH) with arguments from
5814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoargs in a subprocess.
5824adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoIf mode == P_NOWAIT return the pid of the process.
5834adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoIf mode == P_WAIT return the process's exit code if it exits normally;
5844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaootherwise return -SIG, where SIG is the signal that killed it. """
5854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return _spawnvef(mode, file, args, None, execvp)
5864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def spawnvpe(mode, file, args, env):
5884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """spawnvpe(mode, file, args, env) -> integer
5894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5904adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoExecute file (which is looked for along $PATH) with arguments from
5914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoargs in a subprocess with the supplied environment.
5924adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoIf mode == P_NOWAIT return the pid of the process.
5934adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoIf mode == P_WAIT return the process's exit code if it exits normally;
5944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaootherwise return -SIG, where SIG is the signal that killed it. """
5954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return _spawnvef(mode, file, args, env, execvpe)
5964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif _exists("spawnv"):
5984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # These aren't supplied by the basic Windows code
5994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # but can be easily implemented in Python
6004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def spawnl(mode, file, *args):
6024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """spawnl(mode, file, *args) -> integer
6034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6044adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoExecute file with arguments from args in a subprocess.
6054adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoIf mode == P_NOWAIT return the pid of the process.
6064adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoIf mode == P_WAIT return the process's exit code if it exits normally;
6074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaootherwise return -SIG, where SIG is the signal that killed it. """
6084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return spawnv(mode, file, args)
6094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def spawnle(mode, file, *args):
6114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """spawnle(mode, file, *args, env) -> integer
6124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6134adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoExecute file with arguments from args in a subprocess with the
6144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaosupplied environment.
6154adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoIf mode == P_NOWAIT return the pid of the process.
6164adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoIf mode == P_WAIT return the process's exit code if it exits normally;
6174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaootherwise return -SIG, where SIG is the signal that killed it. """
6184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        env = args[-1]
6194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return spawnve(mode, file, args[:-1], env)
6204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    __all__.extend(["spawnv", "spawnve", "spawnl", "spawnle",])
6234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif _exists("spawnvp"):
6264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # At the moment, Windows doesn't implement spawnvp[e],
6274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # so it won't have spawnlp[e] either.
6284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def spawnlp(mode, file, *args):
6294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """spawnlp(mode, file, *args) -> integer
6304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6314adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoExecute file (which is looked for along $PATH) with arguments from
6324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoargs in a subprocess with the supplied environment.
6334adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoIf mode == P_NOWAIT return the pid of the process.
6344adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoIf mode == P_WAIT return the process's exit code if it exits normally;
6354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaootherwise return -SIG, where SIG is the signal that killed it. """
6364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return spawnvp(mode, file, args)
6374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def spawnlpe(mode, file, *args):
6394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """spawnlpe(mode, file, *args, env) -> integer
6404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6414adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoExecute file (which is looked for along $PATH) with arguments from
6424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoargs in a subprocess with the supplied environment.
6434adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoIf mode == P_NOWAIT return the pid of the process.
6444adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoIf mode == P_WAIT return the process's exit code if it exits normally;
6454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaootherwise return -SIG, where SIG is the signal that killed it. """
6464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        env = args[-1]
6474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return spawnvpe(mode, file, args[:-1], env)
6484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    __all__.extend(["spawnvp", "spawnvpe", "spawnlp", "spawnlpe",])
6514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Supply popen2 etc. (for Unix)
6544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif _exists("fork"):
6554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if not _exists("popen2"):
6564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def popen2(cmd, mode="t", bufsize=-1):
6574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            """Execute the shell command 'cmd' in a sub-process.  On UNIX, 'cmd'
6584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            may be a sequence, in which case arguments will be passed directly to
6594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            the program without shell intervention (as with os.spawnv()).  If 'cmd'
6604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            is a string it will be passed to the shell (as with os.system()). If
6614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'bufsize' is specified, it sets the buffer size for the I/O pipes.  The
6624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            file objects (child_stdin, child_stdout) are returned."""
6634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            import warnings
6644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            msg = "os.popen2 is deprecated.  Use the subprocess module."
6654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            warnings.warn(msg, DeprecationWarning, stacklevel=2)
6664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            import subprocess
6684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            PIPE = subprocess.PIPE
6694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            p = subprocess.Popen(cmd, shell=isinstance(cmd, basestring),
6704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                 bufsize=bufsize, stdin=PIPE, stdout=PIPE,
6714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                 close_fds=True)
6724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return p.stdin, p.stdout
6734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        __all__.append("popen2")
6744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if not _exists("popen3"):
6764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def popen3(cmd, mode="t", bufsize=-1):
6774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            """Execute the shell command 'cmd' in a sub-process.  On UNIX, 'cmd'
6784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            may be a sequence, in which case arguments will be passed directly to
6794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            the program without shell intervention (as with os.spawnv()).  If 'cmd'
6804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            is a string it will be passed to the shell (as with os.system()). If
6814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'bufsize' is specified, it sets the buffer size for the I/O pipes.  The
6824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            file objects (child_stdin, child_stdout, child_stderr) are returned."""
6834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            import warnings
6844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            msg = "os.popen3 is deprecated.  Use the subprocess module."
6854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            warnings.warn(msg, DeprecationWarning, stacklevel=2)
6864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            import subprocess
6884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            PIPE = subprocess.PIPE
6894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            p = subprocess.Popen(cmd, shell=isinstance(cmd, basestring),
6904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                 bufsize=bufsize, stdin=PIPE, stdout=PIPE,
6914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                 stderr=PIPE, close_fds=True)
6924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return p.stdin, p.stdout, p.stderr
6934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        __all__.append("popen3")
6944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if not _exists("popen4"):
6964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def popen4(cmd, mode="t", bufsize=-1):
6974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            """Execute the shell command 'cmd' in a sub-process.  On UNIX, 'cmd'
6984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            may be a sequence, in which case arguments will be passed directly to
6994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            the program without shell intervention (as with os.spawnv()).  If 'cmd'
7004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            is a string it will be passed to the shell (as with os.system()). If
7014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'bufsize' is specified, it sets the buffer size for the I/O pipes.  The
7024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            file objects (child_stdin, child_stdout_stderr) are returned."""
7034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            import warnings
7044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            msg = "os.popen4 is deprecated.  Use the subprocess module."
7054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            warnings.warn(msg, DeprecationWarning, stacklevel=2)
7064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            import subprocess
7084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            PIPE = subprocess.PIPE
7094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            p = subprocess.Popen(cmd, shell=isinstance(cmd, basestring),
7104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                 bufsize=bufsize, stdin=PIPE, stdout=PIPE,
7114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                 stderr=subprocess.STDOUT, close_fds=True)
7124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return p.stdin, p.stdout
7134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        __all__.append("popen4")
7144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport copy_reg as _copy_reg
7164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef _make_stat_result(tup, dict):
7184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return stat_result(tup, dict)
7194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef _pickle_stat_result(sr):
7214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (type, args) = sr.__reduce__()
7224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return (_make_stat_result, args)
7234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotry:
7254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _copy_reg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
7264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoexcept NameError: # stat_result may not exist
7274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
7284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef _make_statvfs_result(tup, dict):
7304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return statvfs_result(tup, dict)
7314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef _pickle_statvfs_result(sr):
7334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (type, args) = sr.__reduce__()
7344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return (_make_statvfs_result, args)
7354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotry:
7374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _copy_reg.pickle(statvfs_result, _pickle_statvfs_result,
7384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                     _make_statvfs_result)
7394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoexcept NameError: # statvfs_result may not exist
7404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
741