-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Diez B. Roggisch wrote: > Dave Challis wrote: > >> -----BEGIN PGP SIGNED MESSAGE----- >> Hash: SHA1 >> >> I'm trying to write some code which: >> 1. Finds all modules in a plugin directory >> 2. Imports those modules >> 3. Creates an instance of each object defined in the module (each module >> will contain exactly 1 object, which is a subclass of 'Plugin') >> >> The closest I've come so far is with something like: >> >> In plugin.py: >> # taken from http://docs.python.org/lib/built-in-funcs.html >> def my_import(name): >> mod = __import__(name) >> components = name.split('.') >> for comp in components[1:]: >> mod = getattr(mod, comp) >> return mod >> >> def import_plugins(): >> mods = [] >> for filename in os.listdir('/plugins'): >> if filename.endswith('.py'): >> name = os.path.splitext(filename)[0] >> mods.append(my_import('plugins.' + name)) >> return mods >> >> class Plugin(object): >> pass >> >> >> In plugins/exampleplugin.py: >> class ExamplePlugin(Plugin): >> def __init__(self): >> pass >> >> >> Calling import_plugins() then gives me a list containing references to >> modules. >> >> How can I loop through that list and create an instance of whatever >> object was defined within the module? (In this case I'd want to >> construct an instance of ExamplePlugin) > > > Like this: > > for name in dir(plugin): > thing = getattr(plugin, name) > try: > if issubclass(thing, Plugin): > thing() > except ValueError: # issubclass sucks > pass > > Diez
Thanks for that, it helped as a starting point. I had some trouble with using issubclass though (issubclass(Plugin, Plugin) returns true), which was complicating things. I modified your code to the following instead (which may well have it's own pitfalls I'm not aware of!): for name in dir(plugin): thing = getattr(plugin, name) if hasattr(thing, '__bases__') and \ getattr(thing, '__bases__')[0] == Plugin: thing() Cheers, Dave - -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ><> o ) <>< . ( ( ) Dave Challis <>< ) ) ><> _([EMAIL PROTECTED](____(__________________ -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFIhge8v26GZvAVVFERAh86AJ91DVYPPZ/1x3rjoezFL1P5FXuHNwCZAXdr DgjzmTNV1/H8vcQ/2Hax3js= =ZAtM -----END PGP SIGNATURE----- -- http://mail.python.org/mailman/listinfo/python-list