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

<<TableOfContents>>

== 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.

{{{
#!python
import os

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:
            s.add(module)
    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.

{{{
#!python
import imp

def load_module(name, path=["."]):
    """Return a named module found in a given path."""
    (file, pathname, description) = imp.find_module(name, path)
    return imp.load_module(name, file, pathname, description)

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__}}}.

{{{
#!python
module.__dict__
}}}

== Finding Functions Within a Module ==

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

{{{
#!python
def functions_in_module(module)
    functions = []
    for obj in module.__dict__.values():
        if isinstance(obj, types.FunctionType):
            functions.append(obj)
    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