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.

--
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
 that is made terrible by our own mad attempt to interpret it as though it had
 an underlying truth."
  -- Umberto Eco

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to