[Python-checkins] r42172 - python/trunk/Doc/tools/listmodules.py

fredrik.lundh python-checkins at python.org
Tue Jan 24 17:16:20 CET 2006


Author: fredrik.lundh
Date: Tue Jan 24 17:16:19 2006
New Revision: 42172

Added:
   python/trunk/Doc/tools/listmodules.py   (contents, props changed)
Log:
module list utility



Added: python/trunk/Doc/tools/listmodules.py
==============================================================================
--- (empty file)
+++ python/trunk/Doc/tools/listmodules.py	Tue Jan 24 17:16:19 2006
@@ -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()


More information about the Python-checkins mailing list