Реализация системы плагинов в Python

Я пишу приложение (серверную оболочку для Minecraft), которое я хочу сделать расширяемым с помощью плагинов. У меня есть система, которая работает, однако я думаю, что в долгосрочной перспективе он может использовать улучшение.

Так, как у меня сейчас, приложение вызывает метод "get_plugins" в классе сервера, который сначала импортирует файл с именем pluginutils.py (pluginutils.py определяет класс BasePlugin, который все подклассы плагинов), а затем проходит через каждый .файл py в cmds каталог, импортируя его и проверяя, является ли он подклассом BasePlugin. Если это так, он хранит экземпляр его в словаре, для которого ключ является cmd переменная класса, определенная в плагине. Всякий раз, когда приложение получает команду от сервера, оно проверяет, является ли она ключом в словаре, и если да, то запускает метод start экземпляра, хранящегося в словаре, которому он передает необходимые аргументы, взятые из команда.

пока это работает, я чувствую, что это небрежный способ сделать это. Существуют ли какие-либо лучшие методы для реализации подобной системы? Я хочу написать это сам (я не хочу использовать что-то вроде zope.интерфейс), поскольку это опыт обучения. Спасибо.

2 ответов


написав довольно много различных архитектур плагинов на разных платформах и языках, я скажу, что вы в значительной степени на пути с тем, как большинство систем плагинов написаны.

в основном это сводится к тому, что ваш хост и ваш плагин должны иметь какой-то общий контракт для работы; другими словами, ваш хост должен знать достаточно о вашем плагине, чтобы он мог передавать или делиться любыми общими ресурсами, которые понадобятся плагину, и плагин должен знать достаточно о хосте, чтобы взаимодействовать с этими ресурсами.

реализация этого с использованием базового класса и производного класса, как вы это сделали, является очень распространенной методологией.


Я бы предложил использовать setuptools, потому что плагины связаны в конечном итоге с управлением sys.path список:

http://peak.telecommunity.com/DevCenter/PkgResources

в долгосрочной перспективе решение на основе дистрибутива / упаковки, такое как setuptools всегда будет хорошим выбором, так как:

  • вы должны загружать плагины без конфликтов или отсутствующих требований,
  • даже если загружаемые Плагины зависят от других динамических зависимостей и
  • вы должны обновлять список доступных плагинов по мере установки и удаления пакетов.