mirror of
https://github.com/python/cpython.git
synced 2025-07-29 06:05:00 +00:00
module list utility
This commit is contained in:
parent
3e86595280
commit
ec2f74f4b1
1 changed files with 126 additions and 0 deletions
126
Doc/tools/listmodules.py
Normal file
126
Doc/tools/listmodules.py
Normal file
|
@ -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()
|
Loading…
Add table
Add a link
Reference in a new issue