example - ¿Cómo se puede hacer el equivalente a "importar*desde el módulo" con la función__import__ de Python?
python import from parent directory (5)
Aquí está mi solución para nombrar dinámicamente los archivos de configuración local para Django. Tenga en cuenta la adición debajo de un cheque para no incluir atributos que contengan ''__'' del archivo importado. El __name__
global se sobrescribió con el nombre del módulo del archivo de configuración local, lo que provocó que setup_environ()
, utilizado en manage.py, tuviera problemas.
try:
import socket
HOSTNAME = socket.gethostname().replace(''.'',''_'')
# See http://docs.python.org/library/functions.html#__import__
m = __import__(name="settings_%s" % HOSTNAME, globals=globals(), locals=locals(), fromlist="*")
try:
attrlist = m.__all__
except AttributeError:
attrlist = dir(m)
for attr in [a for a in attrlist if ''__'' not in a]:
globals()[attr] = getattr(m, attr)
except ImportError, e:
sys.stderr.write(''Unable to read settings_%s.py/n'' % HOSTNAME)
sys.exit(1)
Dada una cadena con un nombre de módulo, ¿cómo importar todo en el módulo como si hubiera llamado:
from module import *
es decir, dada la cadena S = "módulo", ¿cómo se obtiene el equivalente de lo siguiente?
__import__(S, fromlist="*")
Esto no parece funcionar como se espera (ya que no importa nada).
El problema subyacente es que estoy desarrollando algunos Django, pero en más de un servidor (con colegas), todos con diferentes configuraciones. Esperaba hacer algo como esto en el archivo project / settings.py:
from platform import node
settings_files = { ''BMH.lan'': ''settings_bmh.py", ... }
__import__( settings_files[ node() ] )
Parecía una solución simple (por lo tanto, elegante), pero estoy de acuerdo en que tiene un olor y la simplicidad sale a relucir cuando tienes que usar la lógica como lo publicó John Millikin (gracias). Aquí está esencialmente la solución que fui con:
from platform import node
from settings_global import *
n = node()
if n == ''BMH.lan'':
from settings_bmh import *
# add your own, here...
else:
raise Exception("No host settings for ''%s''. See settings.py." % node())
Lo cual funciona bien para nuestros propósitos.
No encontré una buena manera de hacerlo, así que tomé una forma más simple pero fea de http://www.djangosnippets.org/snippets/600/
try:
import socket
hostname = socket.gethostname().replace(''.'',''_'')
exec "from host_settings.%s import *" % hostname
except ImportError, e:
raise e
Parece que también puede usar dict.update () en los diccionarios del módulo en su caso:
config = [__import__(name) for name in names_list]
options = {}
for conf in config:
options.update(conf.__dict__)
Actualización: creo que hay una breve versión "funcional" de la misma:
options = reduce(dict.update, map(__import__, names_list))
Por favor reconsidera. Lo único peor que import *
es la import *
mágica import *
.
Si de verdad quieres:
m = __import__ (S)
try:
attrlist = m.__all__
except AttributeError:
attrlist = dir (m)
for attr in attrlist:
globals()[attr] = getattr (m, attr)