mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			126 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# $Id$
 | 
						|
#
 | 
						|
# Locate all standard modules available in this build.
 | 
						|
#
 | 
						|
# This script is designed to run on Python 1.5.2 and newer.
 | 
						|
#
 | 
						|
# Written by Fredrik Lundh, January 2005
 | 
						|
#
 | 
						|
 | 
						|
import imp, sys, os, re, time
 | 
						|
 | 
						|
identifier = "python-%s-%s" % (sys.version[:3], sys.platform)
 | 
						|
timestamp = time.strftime("%Y%m%dT%H%M%SZ", time.gmtime(time.time()))
 | 
						|
 | 
						|
# known test packages
 | 
						|
TEST_PACKAGES = "test.", "bsddb.test.", "distutils.tests."
 | 
						|
 | 
						|
try:
 | 
						|
    import platform
 | 
						|
    platform = platform.platform()
 | 
						|
except:
 | 
						|
    platform = None # unknown
 | 
						|
 | 
						|
suffixes = imp.get_suffixes()
 | 
						|
 | 
						|
def get_suffix(file):
 | 
						|
    for suffix in suffixes:
 | 
						|
        if file[-len(suffix[0]):] == suffix[0]:
 | 
						|
            return suffix
 | 
						|
    return None
 | 
						|
 | 
						|
def main():
 | 
						|
 | 
						|
    path = getpath()
 | 
						|
 | 
						|
    modules = {}
 | 
						|
    for m in sys.builtin_module_names:
 | 
						|
        modules[m] = None
 | 
						|
 | 
						|
    for p in path:
 | 
						|
        modules.update(getmodules(p))
 | 
						|
 | 
						|
    keys = modules.keys()
 | 
						|
    keys.sort()
 | 
						|
 | 
						|
    # filter out known test packages
 | 
						|
    def cb(m):
 | 
						|
        for d in TEST_PACKAGES:
 | 
						|
            if m[:len(d)] == d:
 | 
						|
                return 0
 | 
						|
        return 1
 | 
						|
    keys = filter(cb, keys)
 | 
						|
 | 
						|
    try:
 | 
						|
        outfile = sys.argv[1]
 | 
						|
        if outfile == "-":
 | 
						|
            outfile = None
 | 
						|
        elif outfile == "-f":
 | 
						|
            outfile = "modules-" + identifier + ".txt"
 | 
						|
    except IndexError:
 | 
						|
        outfile = None
 | 
						|
 | 
						|
    if not outfile:
 | 
						|
        out = sys.stdout
 | 
						|
    else:
 | 
						|
        out = open(outfile, "w")
 | 
						|
 | 
						|
    out.write("# module list (generated by listmodules.py)\n")
 | 
						|
    out.write("#\n")
 | 
						|
    out.write("# timestamp=%s\n" % repr(timestamp))
 | 
						|
    out.write("# sys.version=%s\n" % repr(sys.version))
 | 
						|
    out.write("# sys.platform=%s\n" % repr(sys.platform))
 | 
						|
    if platform:
 | 
						|
        out.write("# platform=%s\n" % repr(platform))
 | 
						|
    out.write("#\n")
 | 
						|
 | 
						|
    for k in keys:
 | 
						|
        out.write(k + "\n")
 | 
						|
 | 
						|
    if out is not sys.stdout:
 | 
						|
        out.close()
 | 
						|
        print out.name, "ok (%d modules)" % len(modules)
 | 
						|
 | 
						|
def getmodules(p):
 | 
						|
    # get modules in a given directory
 | 
						|
    modules = {}
 | 
						|
    for f in os.listdir(p):
 | 
						|
        f = os.path.join(p, f)
 | 
						|
        if os.path.isfile(f):
 | 
						|
            m, e = os.path.splitext(f)
 | 
						|
            suffix = get_suffix(f)
 | 
						|
            if not suffix:
 | 
						|
                continue
 | 
						|
            m = os.path.basename(m)
 | 
						|
            if re.compile("(?i)[a-z_]\w*$").match(m):
 | 
						|
                if suffix[2] == imp.C_EXTENSION:
 | 
						|
                    # check that this extension can be imported
 | 
						|
                    try:
 | 
						|
                        __import__(m)
 | 
						|
                    except ImportError:
 | 
						|
                        continue
 | 
						|
                modules[m] = f
 | 
						|
        elif os.path.isdir(f):
 | 
						|
            m = os.path.basename(f)
 | 
						|
            if os.path.isfile(os.path.join(f, "__init__.py")):
 | 
						|
                for mm, f in getmodules(f).items():
 | 
						|
                    modules[m + "." + mm] = f
 | 
						|
    return modules
 | 
						|
 | 
						|
def getpath():
 | 
						|
    path = map(os.path.normcase, map(os.path.abspath, sys.path[:]))
 | 
						|
    # get rid of site packages
 | 
						|
    for p in path:
 | 
						|
        if p[-13:] == "site-packages":
 | 
						|
            def cb(p, site_package_path=os.path.abspath(p)):
 | 
						|
                return p[:len(site_package_path)] != site_package_path
 | 
						|
            path = filter(cb, path)
 | 
						|
            break
 | 
						|
    # get rid of non-existent directories and the current directory
 | 
						|
    def cb(p, cwd=os.path.normcase(os.getcwd())):
 | 
						|
        return os.path.isdir(p) and p != cwd
 | 
						|
    path = filter(cb, path)
 | 
						|
    return path
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    main()
 |