nntp2http.com
Posting
Suche
Optionen
Hilfe & Kontakt

Re: loading a plugin in python

Von: Volker Grabsch (volker_grabsch@v.notjusthosting.com) [Profil]
Datum: 22.07.2009 20:51
Message-ID: <h47n47$gr0$01$1@news.t-online.com>
Newsgroup: de.comp.lang.python
Diez B. Roggisch <deets@nospam.web.de> schrieb:
> Volker Grabsch schrieb:
>>
>>     modulename = "plugin/dummy"
>> [...]
>>     class Dummy:
>>         pass
>>
>>     Plugin = Dummy
>> [...]
>>     p = __import__(modulename).Plugin()
>
> Das geht so nicht.

Doch. Getestet mit Python 2.4 und Python 2.5:

$ cat test.py
modulename = "plugin/dummy"
p = __import__(modulename).Plugin()
print p

$ cat plugin/dummy.py
class Plugin:
def __str__(self):
return "Dummy Plugin"

$ python test.py
Dummy Plugin

> __import__ liefert immer nur das toplevel-modul.

Ja, und? Du hast wahrscheinlich übersehen, dass ich
im Modulnamen einen '/' und keinen '.' habe. :-)

> Stattdessen muss man sowas machen:
>
> module = __import__(modulename)
> for part in modulename.split(".")[1:]:
>      module = getattr(module, part)
>
> module.Plugin()

Dein Ansatz wird nur funktionieren, wenn das Plugin-
Verzeichnis ein Package ist, also eine __init__.py enthält.
Mein Ansatz funktioniert hingegen auch ohne.

> Alternativ ist es vielleicht fuer plugin-systeme eh besser setuptools
> und die dort moeglichen "entry-points" zu benutzen. Damit kann man sich
> alle moeglichen plugins aufzaehlen lassen, ohne wissen zu muessen, in
> welchem Paket die stecken.

Netter Ansatz! Das kannte ich noch gar nicht. Für die, die
es interessiert: Es gibt eine nette Einführung unter
http://aroberge.blogspot.com/2008/12/plugins-part-6-setuptools-based.html


Gruß,

Volker

--
"Wenn du der Meinung bist, der andere sei ein Depp, dann überlass das
Antworten denjenigen, die nicht dieser Meinung sind."

-- Adrian Suter in <5tejveF1d94gkU2@mid.individual.net>

[ Auf dieses Posting antworten ]

Antworten