From: Fredrik Lundh <fredrik@pythonware.com>
Date: Tue, 24 Jan 2006 16:16:19 +0000 (+0000)
Subject: module list utility
X-Git-Tag: v2.5a0~749
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ec2f74f4b13642b1848696fbb96d29c5b9da54b1;p=python

module list utility
---

diff --git a/Doc/tools/listmodules.py b/Doc/tools/listmodules.py
new file mode 100644
index 0000000000..5f3ea026a3
--- /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()