Importando todo (*) dinámicamente desde un módulo

Tengo un módulo de Python que quiero importar dinámicamente, dado solo una cadena del nombre del módulo. Normalmente uso importlib o __import__ y esto funciona bastante bien ya que sé qué objetos quiero importar desde el módulo, pero hay una manera de hacer el equivalente de import * dinámicamente. ¿O hay un mejor enfoque?

Sé que, en general, es una mala práctica usar import * pero los módulos que bash importar se generan automáticamente sobre la marcha y no tengo forma de saber el módulo exacto que contiene la clase a la que me dirijo.

Gracias.

Se me ocurrió un código hacky feo, funciona en Python 2.6. Sin embargo, no estoy seguro de si esto es lo más inteligente que se puede hacer, quizás algunas otras personas aquí tengan alguna idea:

 test = __import__('os',globals(),locals()) for k in dir(test): globals()[k] = test.__dict__[k] 

Probablemente desee marcar aquí para asegurarse de que no está sobrescribiendo nada en el espacio de nombres global. Probablemente podría evitar la parte global y simplemente mirar a través de cada módulo importado dinámicamente para su clase de interés. Esto probablemente sería mucho mejor que contaminar el espacio de nombres global con todo lo que está importando.

Por ejemplo, digamos que su clase se llama Solicitud de urllib2

 test = __import__('urllib2',globals(),locals()) cls = None if 'Request' in dir(test): cls = test.__dict__['Request'] # you found the class now you can use it! cls('http://test.com') 

Utilice la update para los dictados:

 globals().update(importlib.import_module('some.package').__dict__) 

Tenga en cuenta que usar a_module.__dict__ no es lo mismo que from a_module import * , porque todos los nombres son “importados”, no solo los de __all__ o que no comiencen por _ .

Lo siguiente es altamente pecaminoso y lo condenará a purgatorio o algo peor.

 # module A myvar = "hello" # module B import inspect def dyn_import_all(modpath): """Incredibly hackish way to load into caller's global namespace""" exec('from ' + modpath + ' import *', inspect.stack()[1][0].f_globals) # module C from module B import dyn_import_all def print_from(modpath): dyn_import_all(modpath) print(myvar)