Plugin System für Python Applikation

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
burli
User
Beiträge: 1116
Registriert: Dienstag 9. März 2004, 18:22

Montag 30. Juni 2008, 14:29

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?
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Montag 30. Juni 2008, 14:50

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.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Montag 30. Juni 2008, 15:02

TUFKAB – the user formerly known as blackbird
burli
User
Beiträge: 1116
Registriert: Dienstag 9. März 2004, 18:22

Montag 30. Juni 2008, 15:19

@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
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Montag 30. Juni 2008, 15:26

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]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 30. Juni 2008, 16:04

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 Modvoice
burli
User
Beiträge: 1116
Registriert: Dienstag 9. März 2004, 18:22

Montag 30. Juni 2008, 16:35

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?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 30. Juni 2008, 16:47

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mittwoch 2. Juli 2008, 09:31

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
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Mittwoch 2. Juli 2008, 15:41

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
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Montag 7. Juli 2008, 20:35

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.
Antworten