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
Pluginschnittstelle
-
- 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
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]
import this[/code]
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.
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.
-
- 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:
als ausgabe bekomme ich:
leider nichts von Dummy.py und der Klasse DummyPlugin.
Hab ich was falsch gemacht?
gruss
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)
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
-------------------------------------------------------------------------------
Hab ich was falsch gemacht?
gruss
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
jo der vergisst die module gleich wieder.
in sys.modules findest du die Module dann auch.
Gruß
Dookie
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)
Gruß
Dookie
[code]#!/usr/bin/env python
import this[/code]
import this[/code]