Comment faire l’équivalent de & # 8220; importations * du module # 8221; avec Python __import__ fonction?

StackOverflow https://stackoverflow.com/questions/147507

  •  02-07-2019
  •  | 
  •  

Question

Étant donné une chaîne avec un nom de module, comment importer tout dans le module comme si vous aviez appelé:

from module import *

i.e. chaîne donnée S = "module", comment obtient-on l'équivalent de ce qui suit:

__import__(S, fromlist="*")

Cela ne semble pas fonctionner comme prévu (cela n'importerait rien).

Était-ce utile?

La solution

Veuillez reconsidérer. La seule chose pire que import * est la magie import * .

Si vous voulez vraiment:

m = __import__ (S)
try:
    attrlist = m.__all__
except AttributeError:
    attrlist = dir (m)
for attr in attrlist:
    globals()[attr] = getattr (m, attr)

Autres conseils

Voici ma solution pour la dénomination dynamique des fichiers de paramètres locaux pour Django. Notez l'ajout ci-dessous d'une coche pour ne pas inclure les attributs contenant '__' du fichier importé. Le global __ name __ était écrasé par le nom de module du fichier de paramètres local, ce qui a causé des problèmes pour setup_environ () , utilisé dans manage.py.

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)

Le problème sous-jacent est que je développe certains Django, mais sur plusieurs hôtes (avec des collègues), tous avec des paramètres différents. J'espérais faire quelque chose comme ceci dans le fichier project / settings.py:

from platform import node

settings_files = { 'BMH.lan': 'settings_bmh.py", ... } 

__import__( settings_files[ node() ] )

Cela semblait une solution simple (donc élégante), mais je conviens qu’il a une odeur et que la simplicité perdure lorsque vous devez utiliser une logique semblable à celle que John Millikin a postée (merci). Voici essentiellement la solution que je suis allé avec:

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

Ce qui convient à nos besoins.

Il semble que vous puissiez également utiliser dict.update () dans les dictionnaires du module dans votre cas:

config = [__import__(name) for name in names_list]

options = {}
for conf in config:
    options.update(conf.__dict__)

Mise à jour: Je pense qu'il existe un court "fonctionnel". version de celui-ci:

options = reduce(dict.update, map(__import__, names_list))

Comme je ne trouvais pas le bon moyen de le faire, j’ai choisi un moyen plus simple mais plus laid 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top