Plugin system; imp module head scratch

D

Dave

Hi, all,

I'm trying to implement a simple plugin framework, with some
unexpected results. I'm using Python 2.3.4 on Windows 2000.

My script loader.py loads plugin packages from a directory (in this
case its own), and checks a variable defined in the package's
__init__.py for information on the plugin.

The directory in which loader.py sits is itself a package::

plugin_test
|
+ Plugin1
| |
| __init__.py
|
__init__.py
loader.py

I must be misunderstanding how the imp module works, or something.
Although the correct package is returned by my helper method, its
member variables are those of the the parent package, plugin_test.

The output of this demo is::

<module 'Plugin1' from '__init__.pyc'>
Directory plugin_test

Which seems contradictory. What have I got wrong?

Best Regards,

Dave

<Code follows>

This is plugin_test/Plugin1/__init__.py::

dir = "plugin_test/Plugin1"


This is plugin_test/__init__.py::

dir = "plugin_test"


And here is the loader script, plugin_test/loader.py::

import os
import imp

def GetPackage(name, peerFile, relPath = '.'):
"""
Return the named Python package on a
relative path from the file given
"""
path = os.path.normpath(
os.path.join(os.path.dirname(peerFile), relPath))
try:
fObj, path, descr = imp.find_module(name, [path])
except ImportError:
return None
if descr[2] != imp.PKG_DIRECTORY:
return None
try:
return imp.load_module(name, None, '', descr)
except:
return None

if __name__ == "__main__":
pkg = GetPackage("Plugin1", __file__, '.')
print pkg
print "Directory ", pkg.dir
 
K

Keith Dart

Dave said:
Hi, all,

I'm trying to implement a simple plugin framework, with some
unexpected results. I'm using Python 2.3.4 on Windows 2000.

What would be the difference between a "plugin" and a regular Python module?



-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Keith Dart <[email protected]>
public key: ID: F3D288E4
=====================================================================
 
N

Nick Coghlan

Dave said:
Hi, all,

I'm trying to implement a simple plugin framework, with some
unexpected results. I'm using Python 2.3.4 on Windows 2000.

My script loader.py loads plugin packages from a directory (in this
case its own), and checks a variable defined in the package's
__init__.py for information on the plugin.

Packages and modules are really rather different beasts. I wouldn't be surprised
to find that 'find_module' and 'load_module' behave strangely when used for
packages.

Is there any reason you can't temporarily alter sys.path and use __import__
normally? The behaviour of that is generally less quirky.


Anyway, I believe your specific problem is this line:
return imp.load_module(name, None, '', descr)

Try replacing the empty string in the third argument with the path returned from
the find_module call. (At the moment, it is pulling in the __init__.py from the
current directory, and assigning it to the name you requested)

Cheers,
Nick.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,534
Members
45,007
Latest member
obedient dusk

Latest Threads

Top