Wie macht man das Äquivalent von „import * aus dem Modul“ mit Python __import__ Funktion?

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

  •  02-07-2019
  •  | 
  •  

Frage

ein String mit einem Modul Namen gegeben, wie Sie alles im Modul importieren tun, als ob Sie hatte angerufen:

from module import *

d. angegebenen String S = „Modul“, wie man das Äquivalent der folgenden bekommt:

__import__(S, fromlist="*")

Dies scheint nicht wie erwartet (wie er nichts importieren).

War es hilfreich?

Lösung

Bitte überdenken. Das einzige, was schlimmer als import * ist Magie import *.

Wenn Sie wirklich wollen:

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

Andere Tipps

Hier ist meine Lösung für dynamische Benennung von lokalen Einstellungen Dateien für Django. Beachten Sie die zusätzlich unterhalb eines Schecks nicht Attribute sind enthalten ‚__‘ aus der importierten Datei. Die __name__ global wurde mit dem Modulnamen der lokalen Einstellungen Datei überschrieben werden, die setup_environ() verursacht, in manage.py verwendet, um Probleme zu haben.

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)

Das zugrunde liegende Problem ist, dass ich einige Django entwickle, aber auf mehr als einen Host (mit Kollegen), die alle mit unterschiedlichen Einstellungen. Ich habe gehofft, so etwas wie dies im Projekt / settings.py Datei zu tun:

from platform import node

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

__import__( settings_files[ node() ] )

Es schien eine einfache Lösung (so elegant), aber ich würde zustimmen, dass es einen Geruch zu ihm hat und die Einfachheit geht die Schleife aus, wenn Sie Logik wie verwenden, was John Millikin geschrieben (danke). Hier ist im Wesentlichen die Lösung, die ich ging mit:

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

, die für unsere Zwecke gut funktioniert.

Es scheint, dass Sie auch verwenden können dict.update () auf Moduls Wörterbücher in Ihrem Fall:

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

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

Update: Ich denke, es ist eine kurze "funktional" Version davon:

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

Ich habe keinen guten Weg finden, es zu tun, so habe ich eine einfachere, aber hässliche Art und Weise von 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top