# Minimal Python plugin mechanism

Is there a better way to have a minimal Python plugin mechanism than the following?

(This was inspired from this post.)

import sys
import pkgutil
import os.path
import plugins
pluginsPath = os.path.dirname(plugins.__file__)
pluginModules = [name for _, name, _ in pkgutil.iter_modules([pluginsPath])]
dictOfPlugins = {}
for plugin in pluginModules:
thePluginModuleName = "plugins."+plugin
result = __import__(thePluginModuleName)
dictOfPlugins[plugin] = sys.modules[thePluginModuleName]


(This does assume that all your plugins are in a directory called "plugins" and thus are modules in that package, and that that directory has a blank __init__.py file in it.)

If you wanted to look for a particular plugin, the name would be a key in the dictOfPlugins, and the module object itself would be the value. Assuming you knew what the interface to your Python plugin modules would be, this would seem to do the job. Is there a better way to do this?

• I personally would go with the route of having the individual plugin hook themselves into the "plugins" module. Then you wouldn't have to assume they are anywhere. – James Khoury Jun 29 '11 at 7:12
• @James How would you go about ensuring that the code within the plugin that would hook itself in got called? – Andrew Chen Jul 4 '11 at 23:48
• something similar to the way you create template tags/filters in django? have a plugins.register() method and call that after the plugin declaration. (e.g. plugins.register('pluginModuleName') or plugins.register(pluginModule). Does that make sense? – James Khoury Jul 5 '11 at 1:18
• @James that almost makes sense (and would reduce a few lines of this), but it seems to presuppose that all plugin code is in someplace where it is executed - which kind of means that we need to assume that they are somewhere, since we can't really execute everything everywhere - or am I not understanding you correctly? – Andrew Chen Jul 5 '11 at 11:36
• You lost me somewhere. I mean that when you start up your project you would define which plugins you'd want to use. Then you'd access them via the plugins module? Thats where I get a bit vague. I'm not 100% sure how you'd do that. – James Khoury Jul 5 '11 at 23:12