Differences between revisions 1 and 10 (spanning 9 versions)
Revision 1 as of 2005-04-14 22:54:05
Size: 1070
Editor: 168-103-146-113
Comment: How dynamically find modules in a directory, import them, get a handle to them?
Revision 10 as of 2009-12-03 23:21:01
Size: 2008
Editor: vpn-8061f549
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
I frequently want to find all the modules in some directory, with some property, and do something with them. Here's how to find all the modules in some directory, and import them.
Line 3: Line 3:
If you know how, please inform me. Here are some things I'm researching. <<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()]
}}}
Line 6: Line 53:

Once you have your module, you can look inside it, with {{{.__dict__}}}.
Line 12: Line 61:
== Identifying Functions ==

{{{
#!python
import types

def is_it_a_function(obj):
    return isinstance(obj, types.FunctionType)
}}}
Line 24: Line 63:
So, putting them together,... We just look for dictionary values that are of type {{{types.FunctionType}}}.
Line 36: Line 75:
== Finding Modules in a Directory == == See Also ==
Line 38: Line 77:
Is there a better way than just listing the contents of the directory, and taking those tiles that end with ".pyc" or ".py"..? The DocXmlRpcServer page includes code demonstrating the use of these techniques.
Line 40: Line 79:
== Importing the Modules == = Discussion =
Line 42: Line 81:
How do you do it dynamically, just given a filename?

Once you've imported it, how do you get a handle on it? (That is, how do you get it's __dict__?)
  (none yet!)

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

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

  • (none yet!)

ModulesAsPlugins (last edited 2010-06-14 22:06:18 by c-98-207-20-119)

Unable to edit the page? See the FrontPage for instructions.