This wiki is in the process of being archived due to lack of usage and the resources necessary to serve it — predominately to bots, crawlers, and LLM companies. Edits are discouraged.
Pages are preserved as they were at the time of archival. For current information, please visit python.org.
If a change to this archive is absolutely needed, requests can be made via the infrastructure@python.org mailing list.

Here's how to find all the modules in some directory, and import them.

Contents

    1. Finding Modules in a Directory
    2. Importing the Modules
    3. Finding the Things Inside a Module
    4. Finding Functions Within a Module
    5. See Also
  1. Discussion

Finding Modules in a Directory

Is there a better way than just listing the contents of the directory, and taking those tiles that end with ".pyc" or ".py"..?

But perhaps there isn't.

 1 import os
 2 
 3 def find_modules(path="."):
 4  """Return names of modules in a directory.
 5 
 6  Returns module names in a list. Filenames that end in ".py" or
 7  ".pyc" are considered to be modules. The extension is not included
 8  in the returned list.
 9  """
 10  modules = set()
 11  for filename in os.listdir(path):
 12  module = None
 13  if filename.endswith(".py"):
 14  module = filename[:-3]
 15  elif filename.endswith(".pyc"):
 16  module = filename[:-4]
 17  if module is not None:
 18  s.add(module)
 19  return list(modules)

Importing the Modules

How do you import a module, once you have it's name?

With the ImpModule! It dynamically loads named modules.

 1 import imp
 2 
 3 def load_module(name, path=["."]):
 4  """Return a named module found in a given path."""
 5  (file, pathname, description) = imp.find_module(name, path)
 6  return imp.load_module(name, file, pathname, description)
 7 
 8 modules = [load_module(name) for name in find_modules()]

Finding the Things Inside a Module

Once you have your module, you can look inside it, with .__dict__.

 1 module.__dict__

Finding Functions Within a Module

We just look for dictionary values that are of type types.FunctionType.

 1 def functions_in_module(module)
 2  functions = []
 3  for obj in module.__dict__.values():
 4  if isinstance(obj, types.FunctionType):
 5  functions.append(obj)
 6  return functions

See Also

The DocXmlRpcServer page includes code demonstrating the use of these techniques.

Discussion

I got this error when executing find_modules() in a package directory. That is the directory contained an __init.py__ file:

 File "C:\Python254\lib\site-packages\joedorocak\find_modules.py", line 27, in find_modules
 s.add(module)
NameError: global name 's' is not defined

It looks to me like s needs to be initialized (some place near "modules = set()"). I'm not sure what the protocol is here, so I'm just going to leave this comment in the discussion.

Here's what seems to work for me. I got rid of 's' altogether.

def find_modules(path="."):
 """Return names of modules in a directory.

 Returns module names in a list. Filenames that end in ".py" or
 ".pyc" are considered to be modules. The extension is not included
 in the returned list.
 """
 modules = set()
 for filename in os.listdir(path):
 module = None
 if filename.endswith(".py"):
 module = filename[:-3]
 elif filename.endswith(".pyc"):
 module = filename[:-4]
 if module is not None:
 modules.add(module)
 return list(modules)

All the best,

JoeDorocak


2026年02月14日 16:09

AltStyle によって変換されたページ (->オリジナル) /