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