List all the modules that are part of a python package?
Yes, you want something based on pkgutil
or similar -- this way you can treat all packages alike regardless if they are in eggs or zips or so (where os.listdir won't help).
import pkgutil# this is the package we are inspecting -- for example 'email' from stdlibimport emailpackage = emailfor importer, modname, ispkg in pkgutil.iter_modules(package.__path__): print "Found submodule %s (is a package: %s)" % (modname, ispkg)
How to import them too? You can just use __import__
as normal:
import pkgutil# this is the package we are inspecting -- for example 'email' from stdlibimport emailpackage = emailprefix = package.__name__ + "."for importer, modname, ispkg in pkgutil.iter_modules(package.__path__, prefix): print "Found submodule %s (is a package: %s)" % (modname, ispkg) module = __import__(modname, fromlist="dummy") print "Imported", module
The right tool for this job is pkgutil.walk_packages.
To list all the modules on your system:
import pkgutilfor importer, modname, ispkg in pkgutil.walk_packages(path=None, onerror=lambda x: None): print(modname)
Be aware that walk_packages imports all subpackages, but not submodules.
If you wish to list all submodules of a certain package then you can use something like this:
import pkgutilimport scipypackage=scipyfor importer, modname, ispkg in pkgutil.walk_packages(path=package.__path__, prefix=package.__name__+'.', onerror=lambda x: None): print(modname)
iter_modules only lists the modules which are one-level deep. walk_packages gets all the submodules.In the case of scipy, for example, walk_packages returns
scipy.stats.stats
while iter_modules only returns
scipy.stats
The documentation on pkgutil (http://docs.python.org/library/pkgutil.html)does not list all the interesting functions defined in /usr/lib/python2.6/pkgutil.py.
Perhaps this means the functions are not part of the "public" interface and are subject to change.
However, at least as of Python 2.6 (and perhaps earlier versions?)pkgutil comes with a walk_packages method which recursively walks through all themodules available.
This works for me:
import typesfor key, obj in nltk.__dict__.iteritems(): if type(obj) is types.ModuleType: print key