Seite 1 von 1

import Kaskade

Verfasst: Dienstag 2. August 2011, 18:35
von anogayales
Hallo Community,

ich bin gerade dabei mehrer Module zu importieren, von denen ich nicht weiß ob der Benutzer sie alle hat. Dabei ist es wichtig, dass er mindestens eines der Module besitzt.

Bisher habe ich das so gelöst:

Code: Alles auswählen

modul1 = None
modul2 = None
modul3 = None
modul4 = None


try:
    import modul1
except ImportError:
    try:
        import modul2
    except ImportError:
        try:
            import modul3
        except ImportError:
            import modul4
Zu beginn erstell ich eine Variable mit dem Importnamen, damit ich überprüfen kann ob der Import erfolgreich war. Oder ist es besser dafür eine separate Variable einzuführen? Den letzen Import fange ich natürlich nicht ab, damit man auch mitbekommt ob der Benutzer auch mindestens eines davon installiert hat.

Grüße,
anogayales

Re: import Kaskade

Verfasst: Dienstag 2. August 2011, 19:25
von gkuhl
Mein Vorschlag wäre der folgende:

Code: Alles auswählen

for name in ['a', 'b', 'c']:
    try:
        module = __import__(name)
        break
    except ImportError:
        pass
else:   
    raise ImportError
Grüße
Gerrit

Re: import Kaskade

Verfasst: Dienstag 2. August 2011, 20:00
von anogayales
Mit der Möglichkeit kann ich aber nicht überprüfen ob ein Modul geladen wurde oder nicht. Außer einen NameError abzufangen, oder?

Grüße,
anogayales

Re: import Kaskade

Verfasst: Dienstag 2. August 2011, 20:48
von cofi
Nein, aber du kannst sie leicht modifizieren:

Code: Alles auswählen

import itertools
modules = dict(zip(('foo', 'bar', 'baz'), itertools.repeat(None)))
for name in modules:
    try:
        module = __import__(name)
        modules[name] = module
        break
    except ImportError:
        pass
else:   
    raise ImportError

Re: import Kaskade

Verfasst: Dienstag 2. August 2011, 20:50
von anogayales
Vielen Dank!

Auf die Idee das ganze an ein Dictionary zu binden bin ich nicht gekommen.

Grüße,
anogayales

Re: import Kaskade

Verfasst: Dienstag 2. August 2011, 21:02
von snafu

Code: Alles auswählen

def my_import(*modnames):
    for modname in modnames:
        try:
            return __import__(modname)
        except ImportError:
            pass
Geht die Liste der Reihe nach durch und liefert das erste erfolgreich importierte Modul zurück, ansonsten `None`.