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

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
pheder
User
Beiträge: 11
Registriert: Dienstag 14. Oktober 2008, 15:56
Kontaktdaten:

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
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.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

>>> sys = __import__("sys")
>>> sys.version
'2.5.2 (r252:60911, Sep 29 2008, 21:15:13) \n[GCC 4.3.2]'
>>>
pheder
User
Beiträge: 11
Registriert: Dienstag 14. Oktober 2008, 15:56
Kontaktdaten:

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
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 ...
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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...
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
pheder
User
Beiträge: 11
Registriert: Dienstag 14. Oktober 2008, 15:56
Kontaktdaten:

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?
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Uh, wieso probierst du es nicht aus oder liest die Doku? ;)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
pheder
User
Beiträge: 11
Registriert: Dienstag 14. Oktober 2008, 15:56
Kontaktdaten:

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
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

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'
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Das fällt mit "a.b.c" bereits auf die Schnauze.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Ja, ist aber nicht schwer zu erweitern. Das hier war ja nur quick & dirty.
Antworten