# $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()