Seite 1 von 1

Pluginschnittstelle

Verfasst: Montag 26. Juli 2004, 12:30
von rayo
Hi

Ich bin an einer Pluginschnittstelle dran.
Der Enduser soll dann ein .py File in das Pluginverzeichnis kopieren können und das Plugin sollte geladen werden. Was muss ich da beachten? Weil from plugins import * funktioniert nicht, und dann hätte ich nur die Datei importiert aber das Plugin nicht geladen (Objekt instanziert).

Wie mache ich sowas? Da ja der Klassenname auch nicht fest definiert ist mus ich überprüfen von wem das Plugin vererbt ist.

Also nochmals konkret:
- Verzeichnis importieren
- in jedem File, welches im Verzeichnis ist, nach einem Plugin, dass von plugin.Plugin abgeleitet ist suchen

gruss

Verfasst: Montag 26. Juli 2004, 12:54
von Dookie
Hi rayo,

ich würd das plugin-Verzeichnis in den Pythonpath aufnehmen und dann mit __import __ das Modul importieren.
Du kannst mit einer Regex nachschaun ob in der Datei "class\s*\w+\s*\(\s*(plugin.)?Plugin\)" vorkommt.


Gruß

Dookie

Verfasst: Montag 26. Juli 2004, 13:12
von NEBULA
Ich wuerde schon eine kleine API vorschreiben fuer die Pluginmodule, zB eine Variable im Modul, die den Namen der Pluginklasse enthaelt oder eine andere Variable im Modul, die die Pluginversion enthaelt oder die erforderliche Version des Hauptprogrammes, damit dass Plugin funktioniert.

Da die Plugins immer aus einem Verzeichnis stammen?.....

wuerde ich in diesem Verzeichnis ein __init__.py-Skript anlegen, welches die Pluginverwaltung uebernimmt, sprich Laden und Entladen der Plugins.
Per os.walk wuerde ich dann das Verzeichnis nach Pythondateien durchforsten, und diese dann per __import__ importieren, dann untersuchen(API ueberpruefen,per issubclass koennte man zB auch die Vererbung pruefen) und zum Abschluss die Pluginklasse oder eine Instanz davon ggf. mit Verweis auf die Plugindatei in einer Liste speichern.

Verfasst: Montag 26. Juli 2004, 13:35
von rayo
Danke für die Hilfe. __import__ kannte ich noch gar nicht.
Ja alle Plugins sind im selben Verzeichnis.

also ich hab mal ein wenig getestet:

Code: Alles auswählen

def test(nothing,path,files):
    for f in files:
        print f
        __import__(f.split('.')[0],globals(),locals(),[])
        print " ".join(globals().keys())
        print '-'*79

sys.path.append(os.path.abspath('./plugins'))
os.path.walk('./plugins/',test,None)
als ausgabe bekomme ich:

Code: Alles auswählen

Dummy.py
__builtins__ __file__ sys test __name__ pluginmanager os __doc__ types
-------------------------------------------------------------------------------
Dummy.pyc
__builtins__ __file__ sys test __name__ pluginmanager os __doc__ types
-------------------------------------------------------------------------------
leider nichts von Dummy.py und der Klasse DummyPlugin.
Hab ich was falsch gemacht?

gruss

Verfasst: Montag 26. Juli 2004, 13:52
von Dookie
jo der vergisst die module gleich wieder.

Code: Alles auswählen

pluginlist = []

def test(nothing,path,files):
    for f in files:
        print f
        pluginlist.append(__import__(f.split('.')[0],globals(),locals(),[]))
        print " ".join(globals().keys()) # in globals() wirst nix finden!
        print pluginlist
        print '-'*79

sys.path.append(os.path.abspath('./plugins'))
os.path.walk('./plugins/',test,None)
in sys.modules findest du die Module dann auch.

Gruß

Dookie

Verfasst: Montag 26. Juli 2004, 14:10
von rayo
Danke.

Jetzt funktioniert mal das importieren und laden der Plugins :).

Gruss Rayo