Plugin system

Robert Brewer fumanchu at amor.org
Sat Oct 30 12:55:20 EDT 2004


Josiah Carlson wrote:
> Reinhold Birkenfeld <reinhold-birkenfeld-nospam at wolke7.net> wrote:
> > 
> > Irmen de Jong wrote:
> > > Reinhold Birkenfeld wrote:
> > > 
> > >> How would you implement a plugin system (for a web-based 
> application)?
> > > 
> > > This is so general a question that I cannot think of 
> anything concrete to answer.
> > > Please ask again, with more detail about what you 
> want/need/have in mind.
> > 
> > Okay, the question is too open: My focus is on how you 
> would structure
> > the plugin code (directories, files) and how you would write code to
> > load these plugins.
> 
> ...Have a place for plugins
> app/plugins
> 
> ...Load the plugins on startup
> import traceback
> import os
> for fn in os.listdir('plugins'):
>     if fn[:1] != '_' and fn.split('.')[-1] in ('py', 'pyw'):
>         try:
>             globals()[fn] = \
>               __import__('plugins.%s'%fn, globals(), locals(), [fn])
>         except:
>             traceback.print_exc()
> 
> Etcetera.  May not be the best, but it will get the job done.

Right. Working example pulled from a wiki app (junct/__init__.py):

def startup(application):
    application._builtin_rules = [parsers.ParseBoldAndItalic,
                                  parsers.ParseHorizRule,
                                  parsers.TableRule(),
                                  parsers.ListRule(),
                                  parsers.ParseLinks,
##                                  parsers.ParseHighASCII,
                                  parsers.CleanBRs,
                                  parsers.UNCRule,
                                  parsers.FreezeTagRule(),
                                  ]
    application.pluginRules = []
    application.pluginCommands = []
    application.pluginTopicCommands = []
    
    application._post_plugin_rules = [parsers.LineBreakRule(),
                                      parsers.FreezeTagRule(),
                                      parsers.TopicNameRule(),
                                      ]
    
    # Run plugin startups
    plugins = application.config(u'Plugins', default={})
    for plugin, args in plugins.items():
        pluginModule = xray.modules(plugin)
        args = tuple([x.strip() for x in args.split(u',') if x.strip()])
        try:
            startFunc = pluginModule.startup
        except AttributeError:
            pass
        else:
            startFunc(application, *args)


Etcetera. 'xray' uses __import__ like Peter and Josiah mentioned.

Here's the startup function from one of the plugins:


def startup(application):
    application.pluginRules.append(DateRule())
    p = (u'    <a href="%(AbsoluteURLRoot)s/calendar.htm" title='
         u'"Show My Calendar (current week)">Calendar</a>')
    application.pluginCommands.append(p)
    disp = application.config(u'Dispatches')
    disp.update({u'calendar': u'junct.calendar.week',
                 u'month': u'junct.calendar.month',
                 u'newdate': u'junct.calendar.newdate',
                 u'makerecur': u'junct.calendar.makerecur',
                 u'recur': u'junct.calendar.showrecur',
                 u'week': u'junct.calendar.week',
                 })


Robert Brewer
MIS
Amor Ministries
fumanchu at amor.org



More information about the Python-list mailing list