127 lines
3.3 KiB
Python
127 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()
|