Importando dinámicamente módulos de Python

Estoy tratando de importar los miembros de un módulo cuyo nombre no se conoce. En lugar de

import foo 

Estoy usando:

 __import__("foo") 

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

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

Para emular from foo import * puede usar 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) 

El uso from foo import * generalmente está mal visto y emularlo aún más, me imagino.

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

para más información help(__import__)

Puede importar dinámicamente con la ayuda de __import__ . Hay un argumento clave de la __import__ en __import__ para llamar from foo import bar .

A veces desea importar uno de los muchos archivos de configuración, cada uno de los cuales tiene valores diferentes para las mismas variables con nombre, dicts, etc.

No puedes simplemente 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 involucra cierres y espacios de nombres. Lo que encontré funcionó fue llamar a la función madre con ‘nombre_módulo’ como un argumento de cadena, luego importar dinámicamente la variable particular cuando realmente la 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 … tiene una importación dinámica de cualquier variable que desee, desde un módulo importado según lo determinado en el tiempo de ejecución.