import Kaskade

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

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
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

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
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Vielen Dank!

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

Grüße,
anogayales
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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`.
Antworten