Implementierung eines Plugin-Systems in Python

8

Ich schreibe eine Anwendung (einen Server-Wrapper für Minecraft), die ich mit Plugins erweitern möchte. Ich habe ein System, das funktioniert, aber ich denke, auf lange Sicht könnte es Verbesserungen gebrauchen.

Wie ich es jetzt habe, ruft die Anwendung eine "get_plugins" -Methode in der Serverklasse auf, die zuerst eine Datei mit dem Namen pluginutils.py importiert (pluginutils.py definiert eine BasePlugin-Klasse, die alle Plugins der Unterklasse) und dann eine Schleife über jede .py-Datei im Verzeichnis cmds importieren und prüfen, ob es sich um eine Unterklasse von BasePlugin handelt. Wenn dies der Fall ist, speichert es eine Instanz davon in einem Verzeichnis, für das der Schlüssel eine cmd Klassenvariable ist, die im Plugin definiert ist. Immer wenn die Anwendung einen Befehl vom Server empfängt, prüft sie, ob es sich um einen Schlüssel im Wörterbuch handelt. Wenn dies der Fall ist, wird die Startmethode der im Wörterbuch gespeicherten Instanz ausgeführt, an die die aus dem Befehl entnommenen Argumente übergeben werden.

Während das funktioniert, habe ich das Gefühl, dass dies eine schlampige Art ist, es zu tun. Gibt es bessere Techniken, um ein ähnliches System zu implementieren? Ich möchte dies selbst schreiben (ich möchte nichts wie zope.interface verwenden), da dies eine Lernerfahrung ist. Danke.

    
Michael Smith 03.06.2011, 22:59
quelle

2 Antworten

2

Nachdem ich einige verschiedene Plugin-Architekturen in verschiedenen Plattformen und Sprachen geschrieben habe, werde ich sagen, dass Sie mit den meisten Plugins-Systemen auf dem richtigen Weg sind.

Grundsätzlich läuft es darauf hinaus, dass Ihr Gastgeber und Ihr Plugin eine Art gemeinsamen Vertrag haben müssen, um damit zu arbeiten; Mit anderen Worten, Ihr Host muss genug über Ihr Plugin wissen, dass es alle gängigen Ressourcen, die das Plugin benötigt, weitergeben oder teilen kann und dass das Plugin genug über den Host wissen muss, um mit diesen Ressourcen zu interagieren.

Dies zu implementieren, indem Sie eine Basisklasse und eine abgeleitete Klasse verwenden, ist eine sehr übliche Methode.

    
feathj 03.06.2011, 23:19
quelle
0

Ich würde vorschlagen, setuptools zu verwenden, weil Plugins eventuell mit der Verwaltung der sys.path -Liste verknüpft sind:

Ссылка

Auf lange Sicht wäre eine Distribution / Packaging-basierte Lösung wie setuptools immer eine solide Wahl, denn:

  • Sie müssen Plugins ohne Konflikte oder fehlende Anforderungen laden,
  • selbst wenn die geladenen Plugins sich von anderen dynamischen Abhängigkeiten und
  • abhängig machen
  • Sie müssen die Liste der verfügbaren Plugins aktualisieren, wenn Pakete installiert und entfernt werden.
ankostis 26.08.2015 11:53
quelle

Tags und Links