2012-03-20 1 views
8

Sto tentando di importare i membri di un modulo il cui nome non è noto. Invece diImportazione dinamica dei moduli Python

import foo 

sto usando:

__import__("foo") 

Come posso ottenere una cosa simile per il from foo import bar caso invece di ricorrere ad un "eval"?

Aggiornamento: Sembra che il trucco sia fromlist. C'è un modo per emulare from foo import *? fromlist=['*'] non ha fatto il trucco.

risposta

10

di emulare from foo import * si potrebbe usare dir per ottenere gli attributi del modulo importato:

foo = __import__('foo') 
for attr in dir(foo): 
    if not attr.startswith('_'): 
     globals()[attr] = getattr(foo, attr) 

Utilizzando from foo import * è generalmente malvista, ed emulando è ancora di più, immagino.

+0

+1 Sto usando __builtins__ piuttosto che globals() in modo da poter usare questo codice da un altro modulo. –

9
__import__("foo", fromlist=["bar"]) 

per ulteriori informazioni help(__import__)

+0

Grazie. C'è un modo per emulare "da foo import *"? – ustun

1

È possibile importare in modo dinamico con l'aiuto di __import__. Ci sono argomenti chiave fromlist in __import__ per chiamare from foo import bar.

+0

Grazie. C'è un modo per emulare "da foo import *"? – ustun

0

A volte si desidera importare uno dei tanti file di configurazione, ognuno dei quali aveva valori diversi per le stesse variabili denominate, dicts, ecc

Non si può semplicemente fare questo:

def mother_function(module, *args, **kwargs): 
    from module import variable 
    return variable 

def call_home_to_mamma(): 
    import module_42 
    return mother_function(module_42) 

La spiegazione del motivo per cui questo non funziona è superiore al mio livello di retribuzione, e comporta chiusure e spazi dei nomi. Quello che ho trovato lavorato è stato quello di chiamare la funzione madre con 'module_name' come un argomento stringa, quindi dyamically importare la variabile particolare quando ho davvero bisogno:

def mother_function(module_name, *args, **kwargs): 
    exec('from %s import %s' % (module_name, variable)) 
    variable = eval(variable) 
    return variable 

def call_home_to_mamma(): 
    import module_42 
    return mother_function(module_42.__name__) 

Bingo .... avete importazione Dyamic di qualsiasi variabile vuoi, da un modulo importato come determinato in fase di esecuzione.