[Python] Istanziare oggetti dinamicamente

Sbaush sbaush a gmail.com
Lun 16 Apr 2007 15:15:15 CEST


Intanto grazie mille per le prontissime risposte alla mia richiesta...
Le vostre soluzioni funzionano entrambe se provate in terminale.
Non riesco però ad applicarle al mio preciso ambito, per questo entro
con voi nel merito della questione più in profondo.

Ho una directory con dei plugins, che vorrei riuscire a caricare dinamicamente.

Eseguo l'import dinamico cercando nel filesystem le cartelle; ogni
cartella ha al suo interno un  file __init__.py che dovrebbe procedere
all'inclusione del file principale del plugin, che si chiama
NomePlugin.py.
Il codice dedito a questo è

__import__(PF.pluginName, globals(), locals(), [])

In PF.pluginName c'è la stringa con il nome del plugin e quindi della
file .py da importare.

Mi piacerebbe anche istanziare la classe principale all'interno del
file, che si chiama, con un guizzo di fantasia, NomePlugin.

Al momento faccio
NomePlugin.NomePlugin(parametro) (supponendo appunto che sia file
principale che classe si chiamino NomePlugin

vorrei dinamicizzare il tutto ed ho provato con
globals()[PF.pluginName](PF.pluginName)

Traceback (most recent call last):
  File "./AirNMS.py", line 58, in ?
    app = AirNMS(0)
  File "/usr/lib/python2.4/site-packages/wx-2.6-gtk2-unicode/wx/_core.py",
line 7700, in __init__
    self._BootstrapApp()
  File "/usr/lib/python2.4/site-packages/wx-2.6-gtk2-unicode/wx/_core.py",
line 7352, in _BootstrapApp
    return _core_.PyApp__BootstrapApp(*args, **kwargs)
  File "./AirNMS.py", line 53, in OnInit
    frame = MainView.MainView(None, -1, 'AirNMS')
  File "/home/sbaush/Projects/airspot/trunk/MainView.py", line 34, in __init__
    sectionDirector.createAllPlugin()
  File "/home/sbaush/Projects/airspot/trunk/SectionDirector.py", line
71, in createAllPlugin
    self.sectionsReferences[eachSection].createPlugin()
  File "/home/sbaush/Projects/airspot/trunk/Section.py", line 51, in
createPlugin
    self.pluginReferences[eachPlugin]=self.pluginFactory.getPlugin(self.basePath,self.name,eachPlugin)
  File "/home/sbaush/Projects/airspot/trunk/PluginFactory.py", line
22, in getPlugin
    __import__(self.basePath+'.'+self.sectionName+'.'+self.pluginName)
  File "/home/sbaush/Projects/airspot/trunk/sections/Monitor/MapPlugin/__init__.py",
line 8, in ?
    globals()[PF.pluginName](MapPlugin)
TypeError: 'module' object is not callable


Ho provato anche con vars al posto di globals, ma il risultato è stato
lo stesso...

Cosa posso fare?

Sono riuscito a spiegarmi?

-- 
Marco Meoni (Sbaush)


Maggiori informazioni sulla lista Python