Hallo Liste, ich möchte für eine selbstgeschriebene Python-Anwendung AddOn's schreiben. Ichhabe jedoch keinen blassen schimmer wie. Noch nicht mal einen Ansatz habe ich. Google hat mir auch nicht wirklich weiter geholfen. Frage an euch: Wer kannt eine URL wo add-on's in Python beschrieben werden? Deutsch wäre schön. (Ich quäle mich aber auch durch englisch :) ). Wie gesagt, ich brauche nur den ersten 'Anschubser' Roland
Hallo; Am Fri, 15 Feb 2008 16:13:54 +0100 schrieb "Roland M. Kruggel" <rk.liste@bbf7.de>:
ich möchte für eine selbstgeschriebene Python-Anwendung AddOn's schreiben. Ichhabe jedoch keinen blassen schimmer wie. Noch nicht mal einen Ansatz habe ich.
Ich bin unschlüssig, was genau Du eigentlich vorhast und/oder erwartest. :) Spontane Idee: - Definiere Dir eine Basis-Klasse AddOn, in dem Du eine Schnittstelle definierst, die alle AddOns implementieren sollen. - Lass' Deine konkreten AddOns diese Basis-Klasse erweitern. - Schaff' Dir eine Umgebung / Struktur, in der Du in definierter Weise (zu Beginn des Programms? bei Klick auf einen Button? periodisch? ...?) an geeigneter Stelle nach derartigen AddOn-Klassen sucht, diese lädt, in Deiner Anwendung bereitstellt und in geeigneter Form aufruf-/erreichbar macht. IMHO ist Dein Problem aber weniger Python-, als vielmehr software-architektur-spezifisch. Für den konkreten Fall halte ich [1] für einen denkbaren Ansatz. Cheers & viel Erfolg, Kristian [] http://de.wikipedia.org/wiki/Kommando_(Entwurfsmuster) -- Kristian Rink * http://zimmer428.net * http://flickr.com/photos/z428/ jab: kawazu@jabber.ccc.de * icq: 48874445 * fon: ++49 176 2447 2771 "One dreaming alone, it will be only a dream; many dreaming together is the beginning of a new reality." (Hundertwasser)
Roland M. Kruggel schrieb:
Frage an euch: Wer kannt eine URL wo add-on's in Python beschrieben werden?
Bitte definere "add-ons":
Wie gesagt, ich brauche nur den ersten 'Anschubser'
Falls du sowas wie Plug-ins meinst, also externe Module/Pakete, die eine Schnittstelle implementieren, die dein Programm benutzt, dann solltest du dir mal setuptools [1] anschauen, da gibt es eine schöne Lösung zum Finden & Laden von vorhandenen Plug-ins, die sogenannten "entry points". Das wird z.B. von vielen Web-Frameworks benutzt, um Template-Plug-ins zu laden, die dann über das Buffet-Interface [2] einen Templatename und Daten übergeben bekommen und daraus (i.A.) (X)HTML generieren. Chris [1] http://peak.telecommunity.com/DevCenter/setuptools#id18 [2] http://projects.dowski.com/projects/buffet
Am Freitag, 15. Februar 2008 schrieb Christopher Arndt:
Roland M. Kruggel schrieb:
Frage an euch: Wer kannt eine URL wo add-on's in Python beschrieben werden?
Bitte definere "add-ons": add-on == plug-ins Soll so funktionieren wie die add-os in z.B. Firefox. Hintergrund des ganzen ist, ich will meine Applikation erweiterbar machen ohne das der user den Quellcode anfassen muss oder Programmteile austauschbar halten.
Z.B. Das Datenbankbackend soll als Plug-In definiert werden. Dann kann das Plug-In 'SQLite' gegen das Plug-In 'PostgreSQL' ausgetauscht werden. (Ich möchte keinen ORM benutzen)
Wie gesagt, ich brauche nur den ersten 'Anschubser'
Falls du sowas wie Plug-ins meinst, also externe Module/Pakete, die eine Schnittstelle implementieren, die dein Programm benutzt, dann solltest du dir mal setuptools [1] anschauen, da gibt es eine schöne Lösung zum Finden & Laden von vorhandenen Plug-ins, die sogenannten "entry points".
Das kommt meinen Vorstellungen doch schon sehr nahe. Roland
Soll so funktionieren wie die add-os in z.B. Firefox. Hintergrund des ganzen ist, ich will meine Applikation erweiterbar machen ohne das der user den Quellcode anfassen muss oder Programmteile austauschbar halten.
Mir ist immernoch nicht klar, was die Funktion dieser Plugins sein wird. Mit dieser Spezifikation ist das ganz einfach zu machen: def load_plugins(plugin_dir): for file in glob.glob(plugin_dir+"/*.py"): execfile(file) Bei Start des Programms einmal load_plugins("/var/lib/myplugins") aufrufen - fertig. Ob diese Plugins dann tatsächlich Deine Anwendung erweitern können, hängt stark von Deiner Anwendung ab. Wenn Du z.B. eine globale Variable config.DatabaseBackend hast, die durch from pysqlite2 import dbapi2 as DatabaseBackend dann könnte das plugin die austauschen durch import config import psycopg2 config.DatabaseBackend = psycopg2 Du müsstest dann natürlich im ganzen Programm immer brav config.DatabaseBackend benutzen, und nirgends pysqlite2 direkt importieren, also etwa config.DatabaseBackend.connect("connectionstring") Ciao, Martin
Am Samstag, 16. Februar 2008 schrieb Martin v. Löwis:
Soll so funktionieren wie die add-os in z.B. Firefox. Hintergrund des ganzen ist, ich will meine Applikation erweiterbar machen ohne das der user den Quellcode anfassen muss oder Programmteile austauschbar halten.
Mir ist immernoch nicht klar, was die Funktion dieser Plugins sein wird. Mit dieser Spezifikation ist das ganz einfach zu machen:
def load_plugins(plugin_dir): for file in glob.glob(plugin_dir+"/*.py"): execfile(file)
Bei Start des Programms einmal load_plugins("/var/lib/myplugins") aufrufen - fertig.
Supper! Das funktioniert. Genau so etwas habe ich gesucht. Jetzt muss ich mich nur noch um das Interface kümmen. Danke
Ob diese Plugins dann tatsächlich Deine Anwendung erweitern können, hängt stark von Deiner Anwendung ab. Wenn Du z.B. eine globale Variable config.DatabaseBackend hast, die durch
from pysqlite2 import dbapi2 as DatabaseBackend
dann könnte das plugin die austauschen durch
import config import psycopg2 config.DatabaseBackend = psycopg2
Du müsstest dann natürlich im ganzen Programm immer brav config.DatabaseBackend benutzen, und nirgends pysqlite2 direkt importieren, also etwa
Yup. So soll es auch sein.
def load_plugins(plugin_dir): for file in glob.glob(plugin_dir+"/*.py"): execfile(file)
Bei Start des Programms einmal load_plugins("/var/lib/myplugins") aufrufen - fertig.
Supper! Das funktioniert. Genau so etwas habe ich gesucht. Jetzt muss ich mich nur noch um das Interface kümmen. Danke
Gern geschehen! Martin
ich möchte für eine selbstgeschriebene Python-Anwendung AddOn's schreiben. Ichhabe jedoch keinen blassen schimmer wie. Noch nicht mal einen Ansatz habe ich. Google hat mir auch nicht wirklich weiter geholfen.
Frage an euch: Wer kannt eine URL wo add-on's in Python beschrieben werden? Deutsch wäre schön. (Ich quäle mich aber auch durch englisch :) ).
Wie gesagt, ich brauche nur den ersten 'Anschubser'
Kannst Du sagen, was Deine Anwendung ungefähr macht und was beispielsweise in add-on machen würde? Ein Beispiel für add-ons ist Python selbst: Python liefert eine Reihe von Modulen aus; der Programmierer kann aber neue eigene Module schreiben (also add-ons zu Python) und diese dann über "import" benutzen. Eine globale Variable sys.path zeigt an, wo diese add-ons gefunden werden können. Ciao, Martin
Am Samstag, 16. Februar 2008 schrieb Martin v. Löwis:
ich möchte für eine selbstgeschriebene Python-Anwendung AddOn's schreiben. Ichhabe jedoch keinen blassen schimmer wie. Noch nicht mal einen Ansatz habe ich. Google hat mir auch nicht wirklich weiter geholfen.
Frage an euch: Wer kannt eine URL wo add-on's in Python beschrieben werden? Deutsch wäre schön. (Ich quäle mich aber auch durch englisch :) ).
Wie gesagt, ich brauche nur den ersten 'Anschubser'
Kannst Du sagen, was Deine Anwendung ungefähr macht und was beispielsweise in add-on machen würde?
Ein Beispiel für add-ons ist Python selbst: Python liefert eine Reihe von Modulen aus; der Programmierer kann aber neue eigene Module schreiben (also add-ons zu Python) und diese dann über "import" benutzen. Eine globale Variable sys.path zeigt an, wo diese add-ons gefunden werden können.
Ja, im Prinzip hast du recht. Ich möchte jedoch erreichen, dass der EndUser nicht den Quellcode anfassen muss. Ich will das Plug-In (Add-on, oder wie immer man es auch nennt) z.B. einfach in ein definiertes Verzeichniss copieren und die Anwendung soll es dort finden und in die Applikation einbinden. Roland
Roland M. Kruggel schrieb:
Ja, im Prinzip hast du recht. Ich möchte jedoch erreichen, dass der EndUser nicht den Quellcode anfassen muss. Ich will das Plug-In (Add-on, oder wie immer man es auch nennt) z.B. einfach in ein definiertes Verzeichniss copieren und die Anwendung soll es dort finden und in die Applikation einbinden.
Ganz generell gesagt, gibt es zwei Aspekte, die bei Plug-ins von Belang sind: - Wie findet & lädt die Applikatiom Plug-ins? (dazu gibt es z.B. die schon genannte Lösung mit setuptools) - Wie delegiert die Applikation bestimmte Aufgaben an Plug-ins? Für Letzteres musst du Dir schon selbst eine Schnittstellendefinition überlegen. Wie die aussieht, kommt ganz auf den Einsatzzweck an. Für das von dir genannte Beispiel einer Datanbankschnittstelle könnte das z.B. so aussehen, dass du definierst, dass ein Plug-in Methoden für folgende Funktionen bereitstellen muss. - Stelle eine Datenbankverbindung her - Führe ein SQL Statement aus - Liefere die Ergebnisse des letzten Statements (oder einen Teil davon) zurück - usw. Für jede dieser Methoden musst du Name, Parameter und Rückgabewerte festlegen. Andere Anwendungsfälle sind u.U. etwas einfacher. Stelle dir z.B. ein Plug-in für eine Bildverarbeitungssoftware vor, das einen Filter für eine Bild implementiert. So ein Plug-in wird wahrscheinlich nur eine Funktion implementieren müssen, die die Bilddaten entgegen nimmt und die veränderten Daten wieder zurück liefert. Ich kann mich also nur meinem Vorposter Kristian anschließen: dein Problem ist nicht Python-spezifisch, sondern du musst dir erst einmal grundsätzliche Gedanken über Softwaredesign und den Aufbau deiner Anwendung machen. Chris
Am Sonntag, 17. Februar 2008 schrieb Christopher Arndt:
Roland M. Kruggel schrieb:
Ja, im Prinzip hast du recht. Ich möchte jedoch erreichen, dass der EndUser nicht den Quellcode anfassen muss. Ich will das Plug-In (Add-on, oder wie immer man es auch nennt) z.B. einfach in ein definiertes Verzeichniss copieren und die Anwendung soll es dort finden und in die Applikation einbinden.
Ganz generell gesagt, gibt es zwei Aspekte, die bei Plug-ins von Belang sind:
- Wie findet & lädt die Applikatiom Plug-ins? (dazu gibt es z.B. die schon genannte Lösung mit setuptools)
- Wie delegiert die Applikation bestimmte Aufgaben an Plug-ins?
Für Letzteres musst du Dir schon selbst eine Schnittstellendefinition überlegen. Wie die aussieht, kommt ganz auf den Einsatzzweck an. Für das von dir genannte Beispiel einer Datanbankschnittstelle könnte das z.B. so aussehen, dass du definierst, dass ein Plug-in Methoden für folgende Funktionen bereitstellen muss.
- Stelle eine Datenbankverbindung her - Führe ein SQL Statement aus - Liefere die Ergebnisse des letzten Statements (oder einen Teil davon) zurück - usw.
Für jede dieser Methoden musst du Name, Parameter und Rückgabewerte festlegen.
Andere Anwendungsfälle sind u.U. etwas einfacher. Stelle dir z.B. ein Plug-in für eine Bildverarbeitungssoftware vor, das einen Filter für eine Bild implementiert. So ein Plug-in wird wahrscheinlich nur eine Funktion implementieren müssen, die die Bilddaten entgegen nimmt und die veränderten Daten wieder zurück liefert.
Ich kann mich also nur meinem Vorposter Kristian anschließen: dein Problem ist nicht Python-spezifisch, sondern du musst dir erst einmal grundsätzliche Gedanken über Softwaredesign und den Aufbau deiner Anwendung machen.
Ja, ich gebe es ja zu. Ich wusste aber nicht wo ich sonst meine Frage loswerden sollte. Wenn's hier vöölig OT ist, bitte ich um Entschuldigung. Martin hat mir den entscheidenen 'Wink' gegeben. Danke euch allen. Roland
participants (4)
-
"Martin v. Löwis" -
Christopher Arndt -
Kristian Rink -
Roland M. Kruggel