Pluginschnittstelle

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
NEBULA
User
Beiträge: 25
Registriert: Mittwoch 5. März 2003, 11:59
Wohnort: Kleve/NRW

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.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Danke.

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

Gruss Rayo
Antworten