2012-03-20 10 views
8

Estoy intentando importar los miembros de un módulo cuyo nombre no se conoce. En lugar deImportación dinámica de módulos de Python

import foo 

estoy usando:

__import__("foo") 

¿Cómo puedo lograr algo similar para el caso en lugar de recurrir a una "eval" from foo import bar?

Actualización: Parece que fromlist hizo el truco. ¿Hay alguna manera de emular from foo import *? fromlist=['*'] no funcionó.

Respuesta

10

emular from foo import * podría utilizar dir para obtener los atributos del módulo importado:

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

Usando from foo import * está mal en general acerca, y emulando lo más aún, me imagino.

+0

+1 Estoy usando __builtins__ en lugar de globals() para poder usar este código desde otro módulo. –

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

para más información help(__import__)

+0

Gracias. ¿Hay alguna manera de emular "from foo import *"? – ustun

1

Puede importar de forma dinámica con la ayuda de __import__. Hay fromlist argumento clave en __import__ para llamar al from foo import bar.

+0

Gracias. ¿Hay alguna manera de emular "from foo import *"? – ustun

0

veces que desea importar uno de los muchos archivos de configuración, cada uno de los cuales tenía valores diferentes para las mismas variables con nombre, predice, etc.

No se puede hacer esto:

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 explicación de por qué esto no funciona está por encima de mi grado de pago e implica cierres y espacios de nombres. Lo que encontré fue trabajado a llamar a la función madre con 'module_name' como un argumento de cadena, a continuación, importe dyamically la variable particular, cuando realmente lo necesitaba:

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 .... usted tiene la importación de cualquier variable Dyamic que desea, desde un módulo importado como se determina en el tiempo de ejecución.

Cuestiones relacionadas