On Jul 30, 2014 4:37 AM, "Robert Kern" <robert.k...@gmail.com> wrote: > > On 2014-07-30 09:46, Peter Otten wrote: >> >> Steven D'Aprano wrote: >> >>> I'm looking for a programmatic way to get a list of all Python modules >>> and packages. Not just those already imported, but all those which >>> *could* be imported. >>> >>> I have a quick-and-dirty function which half does the job: >>> >>> >>> def get_modules(): >>> extensions = ('.py', '.pyc', '.pyo', '.so', '.dll') >>> matches = set() >>> for location in sys.path: >>> if location == '': location = '.' >>> if os.path.isdir(location): >>> for name in os.listdir(location): >>> base, ext = os.path.splitext(name) >>> if ext in extensions: >>> matches.add(base) >>> return sorted(matches) >>> >>> >>> >>> but I know it's wrong (it doesn't handle packages correctly, or zip >>> files, doesn't follow .pth files, has a very naive understanding of cross- >>> platform issues, fails to include built-in modules that don't live in the >>> file system, and probably more). >>> >>> Is this problem already solved? Can anyone make any suggestions? >> >> >> $ python3 -m pydoc -b >> >> shows a page with modules that I think is more complete than what you have. >> A quick glance at the implementation suggests that the hard work is done by >> >> pkgutil.iter_modules() > > > There are two niggles to this answer: it omits builtin modules, but those are easily discovered through sys.builtin_module_names. It can also include spurious script .py files that cannot be imported because their names are not Python identifiers: e.g. check-newconfigs.py. Those are easy to filter out, fortunately.
It will also omit any modules provided by a custom module finder that doesn't implement iter_modules, which is not a required part of the interface.
-- https://mail.python.org/mailman/listinfo/python-list