[Python-de] Dynamisch Module Nachladen wenn die Namen erst zur Laufzeit bekannt sind?

Bastian Venthur venthur at debian.org
Do Nov 15 19:11:31 UTC 2007


ok habs:

  self.plugin = getattr(mod, "Foo")()

oder lesbarer

  self.plugin = getattr(mod, "Foo")
  self.plugin = self.plugin()

wars gewesen.


Danke für eure Hilfe und schönen Abend,

Bastian

On 15.11.2007 19:20 schrieb Bastian Venthur:
> Danke für die vielen Hinweise mit getattr, irgendwie steh ich trotzdem
> noch aufm Schlauch. Ich möchte ein tatsächliches Objekt zurückhaben, ich
> hab das gefühl ich bekomme mit:
> 
> On 15.11.2007 17:33 schrieb Gerald Klix:
>> def loadPlugin( name ):
>> 	return getattr( __import__( name ), name )
> 
> nur den Typen zurück, aber kein "lebendes" Objekt.
> 
> Wenn "mod" mein erfolgreich dynamisch geladenes Modlul ist, funktioniert
> zwar
> 
>   self.plugin = mod.Foo()
> 
> aber nicht
> 
>   self.plugin = getattr(mod, "Foo")
> 
> Das erste nützt mir aber nix, weil "Foo" ja erst zur Laufzeit gegeben ist.
> 
> Das zweite wird zwar anstandslos ausgeführt, aber wenn ich eine Funktion
> von plugin ausführen möchte bekomm ich immer die Fehlermeldung
> 
> TypeError: unbound method bar() must be called with Foo instance as
> first argument (got type instance instead)
> 
> 
> Schöne Grüße,
> 
> Bastian
> 
>>
>> Mit ein wenig error handling sollte es das schon tun.
>>
>>
>> Bis denne,
>> Gerald
>>
>> Bastian Venthur schrieb:
>>> Super, das geht ja sogar noch viel schneller. Danke!
>>>
>>> Gibts jetzt noch was äquivalentes um die gleichnamige Klasse aus dem
>>> Modul zu bekommen?
>>>
>>> Angenommen, jedes Modul enthält eine Gleichnamige Klasse (die wie gesagt
>>> alle von der gleichen Klasse abstammen).
>>>
>>> Jetzt hab ich das Modul Foo dynamisch geladen, aber wie bekomme ich
>>> dynamisch ein Objekt Foo.Foo ohne exec zu bemühen?
>>>
>>>
>>> Schöne Grüße,
>>>
>>> Bastian
>>>
>>> On 15.11.2007 15:20 schrieb Gerald Klix:
>>>
>>>> Hi,
>>>> das geht ganz einfach, indem man die eingebaute Funktion __import__ verwendet.
>>>> Es ist sogar so, daß import seinerseits wiederum auf __import__ basiert.
>>>>
>>>> Siehe: http://docs.python.org/lib/built-in-funcs.html
>>>>
>>>>
>>>> HTH,
>>>> Gerald
>>>>
>>>> Bastian Venthur schrieb:
>>>>
>>>>> Hi Liste,
>>>>>
>>>>>
>>>>> Was ist der eleganteste Weg um dynamisch Module aus einem Paket
>>>>> nachzuladen wenn die Modulnamen erst zur Laufzeit feststehen?
>>>>>
>>>>> Als uneleganteste Lösung könnte man bei Programmstart alle Module eines
>>>>> Paketes laden (wobei zur Zeit der Programmierung die Namen noch nicht
>>>>> feststehen), also sowas wie
>>>>>
>>>>>  import paket.*                 oder
>>>>>  from paket import *
>>>>>
>>>>> was ja leider nicht geht.
>>>>>
>>>>> Besser wäre wenn bei Nutzereingabe der string genommen wird und sowas wie
>>>>>
>>>>>  from paket import eingabe
>>>>>
>>>>> das könnte man mit exec sicher noch irgendwie machen, aber kennt jemand
>>>>> ne elegantere Lösung?
>>>>>
>>>>> Hintergrund ist eine Nutzanwendung in dem in einem Paket nur Module sind
>>>>> die eine Klasse enthalten die alle von der selben Klasse abgeleitet
>>>>> sind. Je nach Nutzereingabe soll die jeweilige Klasse geladen werden.
>>>>> Sowas wie ein Plugin-System eben. Schön wäre es auch wenn man bei neuer
>>>>> Eingabe das alte Modul wieder entladen könnte...
>>>>>
>>>>>
>>>>> Schöne Grüße,
>>>>>
>>>>> Bastian
>>>>>
>>>> _______________________________________________
>>>> python-de maillist  -  python-de at python.net
>>>> http://python.net/mailman/listinfo/python-de
>>>>
>>>
>>
>> _______________________________________________
>> python-de maillist  -  python-de at python.net
>> http://python.net/mailman/listinfo/python-de
>>
> 
> 


-- 
Bastian Venthur                                      http://venthur.de
Debian Developer                                 venthur at debian org