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

Bastian Venthur venthur at debian.org
Do Nov 15 18:20:14 UTC 2007


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