Import unterschiedlicher Module zur Laufzeit

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
Pumuggel
User
Beiträge: 2
Registriert: Donnerstag 26. April 2007, 13:58

Hallo,

folgendes Problem: Ich habe auf zwei Rechnern unterschiedliche sqlite-Module zur Verfügung. Mein Programm soll auf beiden Rechnern laufen. Da sich beide Module an die dbapi halten, kommt das Programm auch mit beiden klar. Die Import-Anweisungen sehen bisher so aus:

Code: Alles auswählen

#from pysqlite2 import dbapi2 as sqlite
#import sqlite3 as sqlite
Bisher funktioniert das natürlich nur, indem ich eines der beiden nicht auskommentiere. Jetzt möchte ich gerne, dass zur Runtime festgestellt wird, welches der beiden Module importiert werden kann. Mein Ansatz war folgender:

Code: Alles auswählen

#sqlite = None
#if module1exists:
#    sqlite = __import__('sqlite3', globals(),  locals(), [])
#elif module2exists:
#    sqlite = __import__('pysqlite2', globals(),  locals(), ['dbapi2'])
Nun meine Fragen dazu:
(1) Wie stelle ich fest, ob ein bestimmtes Modul verfügbar ist zum importieren? (Ich habe gesehen, dass import-Fehler mittels try-except abgefangen werden können. Aber eine try-except-Verschachtelung, bis das richtige Modul gefunden ist, fände ich sehr unschön, oder?)
(2) Wie müssen die import-Anweisungen richtig lauten, um das gleiche Ergebnis wie im ersten Beispiel zu erhalten? __import__ scheint der richtige Weg zu sein, aber ich erhalte ein anderes Ergebnis als im ersten Besipiel.

Vorab schon mal vielen Dank für jegliche Hilfe...
BlackJack

``try``/``except``-Verschachtelung ist der übliche Weg. Ist IMHO auch nicht unschön wenn man sich auf wenige Alternativen beschränken kann. Wenn es viele sind, dann könnte man etwas in folgender Art schreiben:

Code: Alles auswählen

sqlite = None
for name, fromlist in (('pysqlite2.dbapi2', ['dbapi2']), ('sqlite3', [])):
    try:
        sqlite = __import__(name, globals(), locals(), fromlist)
    except ImportError:
        pass
if sqlite is None:
    raise ImportError('no suitable sqlite module found')
Pumuggel
User
Beiträge: 2
Registriert: Donnerstag 26. April 2007, 13:58

BlackJack hat geschrieben:``try``/``except``-Verschachtelung ist der übliche Weg. Ist IMHO auch nicht unschön wenn man sich auf wenige Alternativen beschränken kann. Wenn es viele sind, dann könnte man etwas in folgender Art schreiben:

Code: Alles auswählen

sqlite = None
for name, fromlist in (('pysqlite2.dbapi2', ['dbapi2']), ('sqlite3', [])):
    try:
        sqlite = __import__(name, globals(), locals(), fromlist)
    except ImportError:
        pass
if sqlite is None:
    raise ImportError('no suitable sqlite module found')
Oh, so sieht es auch mit try-except schön aus! :-) Ich kannte die Möglichkeit einer Schleife über eine mehrdimensionale Liste gar nicht, noch was gelernt. Werde auch direkt schauen, ob die import-Statements so funktionieren.

Danke!
Antworten