Re: loading a plugin in python

22/07/2009 - 20:51 von Volker Grabsch | Report spam
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/1...based.html


Gruß,

Volker

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

 

Lesen sie die antworten

#1 Peter Otten
22/07/2009 - 21:26 | Warnen spam
Volker Grabsch wrote:

Diez B. Roggisch 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:



Das ist ein "implementation accident", das mit 2.6 behoben wurde:

$ python2.4 -c"__import__('blue/moon')"
$ python2.5 -c"__import__('blue/moon')"
$ python2.6 -c"__import__('blue/moon')"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: Import by filename is not supported.

Peter

Ähnliche fragen