Seite 1 von 1

Wie realisiere ich Plugins / "__import__() as"?

Verfasst: Sonntag 26. Oktober 2008, 17:45
von pheder
Hi,

Ich frage mich schon seit längerem wie ich folgendes Problem lösen könnte:

Ich will eine bestimmte Aufgabe (in meinem Fall eine Eingabe an eine Webseite, aber das tut nichts zur Sache) über verschiedene Wege realisieren können (sprich vom Anwender geregelt). Dazu habe ich vor eine Klasse zu importieren, und bei ihr die Methoden "upload", "geturl" etc. auszuführen, die in jeder meiner Klassen vorhanden sind. Das Problem ist jedoch folgendes: Ich könnte die Module (und damit auch die Klassen) zwar variabel importieren (__import__()), allerdings kann ich dann nicht auf das Modul zugreifen.

Wenn ich

Code: Alles auswählen

__import__(string)
mache, dann geht das leider immernoch nicht:

Code: Alles auswählen

MeineInstanz = string.Klassenname(parameter,parameter)
Da ich ja nur ein Modul mit dem Wert von "string" importiert habe, aber nicht das Modul "string"

Ich weiß, ich habe das jetzt sehr umständlich ausgedrückt, aber auch nur weil ich selbst nicht wirklich weiß wie ich das umsetzen sollte. Ich will in etwa ein Plugin-/Addonsystem umsetzen, doch mir fehlt jeder Anhaltspunkt, wie. Wie macht ihr sowas?

mfG, pheder

Verfasst: Sonntag 26. Oktober 2008, 17:51
von lunar
__import__ gibt das importierte Modul als Objekt zurück, du musst diesen Rückgabewert an einen Namen binden, um darauf zugreifen zu können.

Komfortabler ist es allerdings, wenn du dir andere Pakete anschaust, und deren Funktionalität kopierst. Werkzeug beispielsweise bietet import_string, welches du aus den Werkzeug-Quellen in deine eigene Software kopieren könntest.

Verfasst: Sonntag 26. Oktober 2008, 17:52
von str1442
>>> sys = __import__("sys")
>>> sys.version
'2.5.2 (r252:60911, Sep 29 2008, 21:15:13) \n[GCC 4.3.2]'
>>>

Verfasst: Sonntag 26. Oktober 2008, 18:24
von pheder
lunar hat geschrieben:Komfortabler ist es allerdings, wenn du dir andere Pakete anschaust, und deren Funktionalität kopierst. Werkzeug beispielsweise bietet import_string, welches du aus den Werkzeug-Quellen in deine eigene Software kopieren könntest.
Danke erstmal für die Erklärung, bin unglaublich erleichtert.

Mh, ich verstehe jetzt allerdings nicht ganz wieso ich die Funktion von Werkzeug der built-in-Funktion vorziehen sollte...

Und wie du den ersten Satz meinst, mh, schwierig :D Soll ich mir anschauen wie es in anderen Programmen gemacht wird? Hab im Exaile-Sourcecode (war grad zur Hand) nachgeschaut und nichts gefunden :D

Verfasst: Sonntag 26. Oktober 2008, 18:47
von lunar
pheder hat geschrieben:Mh, ich verstehe jetzt allerdings nicht ganz wieso ich die Funktion von Werkzeug der built-in-Funktion vorziehen sollte...
Weil sie komfortabler ist ...

Verfasst: Sonntag 26. Oktober 2008, 20:06
von birkenfeld
pheder hat geschrieben:Mh, ich verstehe jetzt allerdings nicht ganz wieso ich die Funktion von Werkzeug der built-in-Funktion vorziehen sollte...
Weil `__import__('os.path')` wahrscheinlich nicht ganz das macht, was du dir vorstellst...

Verfasst: Sonntag 26. Oktober 2008, 20:28
von pheder
naja, so stell ich mir das vor:

Code: Alles auswählen

ospathmodul = __import__("os.path")
if ospathmodul.dirname() == os.path.dirname():
    print "happy!"
output: happy!

Wie ist es denn wirklich?

Verfasst: Sonntag 26. Oktober 2008, 20:29
von birkenfeld
Uh, wieso probierst du es nicht aus oder liest die Doku? ;)

Verfasst: Sonntag 26. Oktober 2008, 21:10
von pheder
birkenfeld hat geschrieben:Uh, wieso probierst du es nicht aus oder liest die Doku? ;)
:oops: Schande über mich! Manchmal sieht man den Wald vor lauter bäumen nicht...
Die Doku hab ich ja gelesen (so hab ich auch __import__ erst gefunden^^), aber anscheinend nicht richtig verstanden...

Jetzt getestet: import_string verhält sich tatsächlich wie erwartet, mit _import__ bekomm ich von "os.path" nur das Modul "os" geladen, also immer nur das "erste Modul". Danke für die Hilfe, das nächste Mal les ich lieber 3- als 2mal und schreib dafür nur 1- statt 3mal :D

Verfasst: Sonntag 26. Oktober 2008, 21:32
von str1442
Oder so:

Code: Alles auswählen

>>> def import_from(name):
...  return getattr(__import__(name.split(".")[0]), name.split(".")[1])
... 
>>> os_path = import_from("os.path")
>>> os_path.join("blub", "xyz")
'blub/xyz'

Verfasst: Sonntag 26. Oktober 2008, 21:38
von birkenfeld
Das fällt mit "a.b.c" bereits auf die Schnauze.

Verfasst: Sonntag 26. Oktober 2008, 21:47
von str1442
Ja, ist aber nicht schwer zu erweitern. Das hier war ja nur quick & dirty.