Я делал так (безотносительно к фреймворку, просто скрипт с плагинами):
1. Продумал структуру папок для плагинов, допустим, в самом простом случае, папка plugin
2. Продумал API плагина, допустим, каждый плагин должен иметь метод run()
В итоге в папке plugin (которая должна быть и пакетом и содержать модуль __init__.py) лежат все модули-плагины.
Далее, в коде, делаем загрузчик плагинов, который использует функцию __import__() для загрузки пакета плагинов, анализа всех модулей пакета и импорта нужного модуля.
def load_plugin_module(plugin):
'''Загрузка модуля плагина по имени.
plugin - имя модуля плагина.
Возвращает:
mod - модуль плагина
'''
try:
# fromlist=[plugin] - здесь просто МАГИЯ,
# без этого не импортируется то, что нужно
vpkg = __import__(PLUGIN_DIR, fromlist=[plugin])
return getattr(vpkg, plugin)
except ImportError:
raise RuntimeError('Plugin %s not found' % plugin)
except ValueError:
raise RuntimeError('Invalid plugin name %s' % plugin)
Поскольку мы знаем API каждого плагина (он у нас единый), то после импорта нужного плагина мы знаем как к этому плагину обращаться.
plug = load_plugin_module(known_plugin_name)
plug.run()