una que librería librerias libreria instalo instalar importar enseño descargar cómo como agregar python import python-module

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



que es pip python (4)

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 intento 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.


La única manera en que puedo pensar en hacer esto es usar exec() y generar dinámicamente el comando importlib sobre la marcha.


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)


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'')


Use update para dicts:

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 comienzan con _ .