Hi,
wie könnte man Plugins in Python realisieren? Also angenommen ich habe eine Applikation wie zb einen Editor und möchte eine Plugin Schnittstelle, ähnlich wie bei Gedit
Gibt es da schon etwas? Oder was müsste man beachten?
Plugin System für Python Applikation
@mitsuhiko: danke, werd ich mir mal anschauen
@Pekh: ich bin nicht wirklich fündig geworden. Das es keine universelle Lösung gibt ist mir klar. aber zumindest mal einen Ansatz sehen damit man sieht wie es generell funktionieren könnte hilft
@Pekh: ich bin nicht wirklich fündig geworden. Das es keine universelle Lösung gibt ist mir klar. aber zumindest mal einen Ansatz sehen damit man sieht wie es generell funktionieren könnte hilft
http://www.python-forum.de/topic-9977.h ... 7029e4387c
http://www.python-forum.de/viewtopic.php?p=12533#12533
Und die Wikilinks finde ich einfach nicht mehr ... Jens hatte vor nicht allzu langer Zeit mal einen Link gepostet, aber Suchfunktion und Inhaltsverzeichnis des Wikis lassen mich im Stich ... Vielleicht kann er den Link noch einmal rauskramen.
Edit: Doch noch gefunden: [wiki]Import[/wiki]
http://www.python-forum.de/viewtopic.php?p=12533#12533
Und die Wikilinks finde ich einfach nicht mehr ... Jens hatte vor nicht allzu langer Zeit mal einen Link gepostet, aber Suchfunktion und Inhaltsverzeichnis des Wikis lassen mich im Stich ... Vielleicht kann er den Link noch einmal rauskramen.
Edit: Doch noch gefunden: [wiki]Import[/wiki]
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Man könnte die im Artikel von mitsuhiko angesprochenen setuptools-Entrypoints verwenden. Allerdings gebe ich zu, dass ich damit noch nichts gemacht habe - daher kann ich schwer abschätzen, wie kompliziert das wäre.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Schwer zu sagen, ich habe noch nie Eclipse-Plugins geschrieben. Entry points-Dokumentation.burli hat geschrieben:Bin noch nicht dazu gekommen mir das anzuschauen. Ist das dann sowas ähnliches wie bei Eclipse?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Die Art, wie Django Applikationen, Kontext-Prozessoren und Middleware einbindet, ist doch auch ein Plug-In-System und da könnte man doch auch abgucken. Im Prinzip erwarten sie an der richtigen Stelle im Dateisystem bestimmte Dateien und laden sie.
Stefan
Stefan
Im Prinziep ist ein Plugin-System wiklich nicht schwer. Du brauchst erstmal eine gute API. Nehmen wir an, jedes Plugin ist in einem eigenen Ordner im Unterordner `plugins` und repräsentiert eben ein eigenes, importierbares Modul.
Dann brauchst du im Prinziep nur ne Such-Methode:
Wobei `Plugin` ein Wrapper darstellt, der unter anderem die `metadata.txt` parsed und halt die Abstraktion zum Plugin für die Applikation darstellt.
Mehr brauchts schon gar nicht, um etwas gutes hinzubekommen. Du könntest dann halt in jedem Plugin eine `setup`-Methode erwarten, welche sich mit der Applikation registriert oder halt bestimmte Methoden aufruft, oder was weiß der Geier
Eine Plugin-Klasse könnte im Simpelsten Fall so ausschaun:
Das ist nur dummy Code, aber für etwas funktionierendes könntest du dir bei bestehenden Applikationen etwas abschauen. Beispiel textpress.pluginsystem
Gruß, Christopher
Dann brauchst du im Prinziep nur ne Such-Methode:
Code: Alles auswählen
BUILTIN_PLUGIN_FOLDER = path.join(path.dirname(__file__), 'plugins')
def find_plugins():
"""Return an iterator over all plugins available."""
for folder in [BUILTIN_PLUGIN_FOLDER]:
if not path.exists(folder):
continue
for filename in listdir(folder):
full_name = path.join(folder, filename)
if path.isdir(full_name) and \
path.isfile(path.join(full_name, 'metadata.txt')):
yield Plugin(filename, path.abspath(full_name))
Mehr brauchts schon gar nicht, um etwas gutes hinzubekommen. Du könntest dann halt in jedem Plugin eine `setup`-Methode erwarten, welche sich mit der Applikation registriert oder halt bestimmte Methoden aufruft, oder was weiß der Geier
Eine Plugin-Klasse könnte im Simpelsten Fall so ausschaun:
Code: Alles auswählen
class Plugin(object):
def __init__(self, name, path_):
self.name = name
self.path = path_
def activate(self):
get_application().register_plugin(self.name)
def deactivate(self):
get_application().deregister_plugin(self.name)
@property
def module(self):
try:
return __import__('myapp.plugins.' + self.name,
None, None, ['setup'])
except ImportError:
#... fehlerbehandlung :)
Gruß, Christopher
Einfach gehts z.b. indem du ein verzeichnis die py dateien einzeln mit der
__import__ funktion importierst.
Die plugins müssen dann z.b. eine entry funktion oder bestimmte konventionen erfüllen das du bei allen die gleiche startup Prozedur durchführen kannst.
__import__ funktion importierst.
Die plugins müssen dann z.b. eine entry funktion oder bestimmte konventionen erfüllen das du bei allen die gleiche startup Prozedur durchführen kannst.