Domenico Chierico ha scritto: > On Sun, 2008-06-29 at 15:54 +0200, Leonardo wrote: > >> Quindi mi sarebbe d'aiuto un buon metodo per importare moduli a seconda >> di una variabile, o altri modo per definire ed utilizzare funzioni in >> files esterni al "cuore" del programma. >> Grazie per le eventuali risposte :) > > credo che quello che tu stai cercando e' proprio la funzione __import__ > che ti permette di importare un modulo dal suo nome. > > Io personalmente risolvo questo tipo di problema usando una directory > come modulo dei plugin, quindi all'avvio dell'applicazione cerco i file > all'interno di quella directory e da questi vi importo le classi (senza > istanziarle e creo un indice degli oggetti, per associare a questi delle > regole di attivazione (come nel tuo caso) uso un metodo di classe che mi > ritorna la chiave di selezione per quello specifico oggetto. > > eccoti un breve esempio: > > tmp = [ i for i in os.listdir("Actions") if i.endswith(".py")] > self.handlers = {} > for i in tmp: > cname = i[0:-3] > module = __import__("Actions."+cname, globals(),locals(),["*"]) > mtclass = getattr(module,cname) > self.handlers[mtclass.getRule()]= mtclass
Ancora più facile è usare execfile() per eseguire un file python in un dizionario dal quale poi pescare gli oggetti che servono. Come vantaggio i tuoi plugin non devono risiedere nel pythonpath, il risultato della funzione non è il package di base (Actions nel tuo caso, per cui dopo è necessario fare "getattr(module,cname)". In generale le operazioni fatte con execfile mi sembrano più pulite (__import__ è l'hook che implementa lo statement import: presa in maniera isolata da questo contesto, la sua semantica è quantomeno bizzarra). Documentazione: - __import__(): http://docs.python.org/lib/built-in-funcs.html#l2h-6 - execfile(): http://docs.python.org/lib/built-in-funcs.html#l2h-26 -- Daniele Varrazzo - Develer S.r.l. http://www.develer.com _______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python