Seite 1 von 1

Plugin System für Python Applikation

Verfasst: Montag 30. Juni 2008, 14:29
von burli
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?

Verfasst: Montag 30. Juni 2008, 14:50
von Pekh
Such mal hier im Forum und im Wiki, da gab es mindestens zwei Vorschläge, wie man so etwas realisieren könnte. Letztlich mußt du es aber immer auf deine spezielle Anwendung maßschneidern.

Verfasst: Montag 30. Juni 2008, 15:02
von mitsuhiko

Verfasst: Montag 30. Juni 2008, 15:19
von burli
@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

Verfasst: Montag 30. Juni 2008, 15:26
von Pekh
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]

Verfasst: Montag 30. Juni 2008, 16:04
von Leonidas
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.

Verfasst: Montag 30. Juni 2008, 16:35
von burli
Leonidas hat geschrieben:Man könnte die im Artikel von mitsuhiko angesprochenen setuptools-Entrypoints verwenden
Bin noch nicht dazu gekommen mir das anzuschauen. Ist das dann sowas ähnliches wie bei Eclipse?

Verfasst: Montag 30. Juni 2008, 16:47
von Leonidas
burli hat geschrieben:Bin noch nicht dazu gekommen mir das anzuschauen. Ist das dann sowas ähnliches wie bei Eclipse?
Schwer zu sagen, ich habe noch nie Eclipse-Plugins geschrieben. Entry points-Dokumentation.

Verfasst: Mittwoch 2. Juli 2008, 09:31
von sma
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

Verfasst: Mittwoch 2. Juli 2008, 15:41
von EnTeQuAk
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:

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))
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 :D

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 :)
Das ist nur dummy Code, aber für etwas funktionierendes könntest du dir bei bestehenden Applikationen etwas abschauen. Beispiel textpress.pluginsystem


Gruß, Christopher

Verfasst: Montag 7. Juli 2008, 20:35
von Mad-Marty
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.