En Mon, 14 Sep 2009 10:30:07 -0300, samwyse <samw...@gmail.com> escribió:
### I've tried this under both Python 2.5.1 and 3.1.1, and it isn't working with either one. Here is my program: class Plugin(object): """This is the base object for a plug-in.""" pass def load_plugins(plugin_subdir='plugins'): import sys, pkgutil, imp, os.path try: # Use this path if we're running as a module. homedir = __path__[0] except NameError: # Use this path if we're running stand-alone. homedir = sys.path[0] plugin_path = [ os.path.join(homedir, plugin_subdir) ] modules = {} for loader, name, is_pkg in pkgutil.iter_modules(plugin_path): file, pathname, desc = imp.find_module(name, plugin_path) modules[name] = imp.load_module(name, file, pathname, desc) for pair in modules.items(): print('name = %r\nmodule = %r\n' % pair) if __name__ == '__main__': print('subclasses = %r\n' %(Plugin.__subclasses__())) load_plugins() print('subclasses = %r\n' %(Plugin.__subclasses__())) ### And here is my plugin, in plugins/myplugin.py: from plugin import Plugin class MyPlugin(Plugin): pass ### When I run the main program, I get this: subclasses = [] name = 'myplugin' module = <module 'myplugin' from 'C:\Documents and Settings\sam_denton \Desktop\scripting\plugins\myplugin.py'> subclasses = [] ### Obviously, myplugin is being found found and loaded, but my base class doesn't know about it. Any ideas?
Don't run the first module as a program itself. When it's run as a program, it's known as '__main__'; when someone executes 'import plugin' *another* copy is imported under the name 'plugin'. So your plugin classes inherit from plugin.Plugin but you're printing __main__.Plugin subclasses.
-- Gabriel Genellina -- http://mail.python.org/mailman/listinfo/python-list