summaryrefslogtreecommitdiffstats
path: root/Doc/tools
diff options
context:
space:
mode:
authorFredrik Lundh <fredrik@pythonware.com>2006-01-24 16:16:19 (GMT)
committerFredrik Lundh <fredrik@pythonware.com>2006-01-24 16:16:19 (GMT)
commitec2f74f4b13642b1848696fbb96d29c5b9da54b1 (patch)
tree84b329dea3c9eea2c2ea6525be264f2880020dee /Doc/tools
parent3e86595280a9714354372f91108be4d184da8a5f (diff)
downloadcpython-ec2f74f4b13642b1848696fbb96d29c5b9da54b1.zip
cpython-ec2f74f4b13642b1848696fbb96d29c5b9da54b1.tar.gz
cpython-ec2f74f4b13642b1848696fbb96d29c5b9da54b1.tar.bz2
module list utility
Diffstat (limited to 'Doc/tools')
-rw-r--r--Doc/tools/listmodules.py126
1 files changed, 126 insertions, 0 deletions
diff --git a/Doc/tools/listmodules.py b/Doc/tools/listmodules.py
new file mode 100644
index 0000000..5f3ea02
--- /dev/null
+++ b/Doc/tools/listmodules.py
@@ -0,0 +1,126 @@
+# $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()