Seite 1 von 1
Falscher Datentyp bei Modul Import
Verfasst: Sonntag 18. Oktober 2009, 12:52
von Kinglui
Hallo,
ich versuche mich gerade mehr mit Python anzufreunden, hänge aber an ein paar kleinen Problemen.
Ich möchte mit einem try Except Block eine ImportError Exception abfangen.Ich dachte das ganze wäre besser als Schleife, dann kann ich mir lästige Tipparbeit sparen. Wenn ich aber eine Liste, mit den zu importierenden Modulen erstelle, ist der Datentyp immer nicht korrekt (in dem Fall ein String) und die Module werden nicht gefunden.
Wie kann ich denn einen Modul Datentyp definieren?
Code: Alles auswählen
import sys
Modulliste = ['bla', 'blubb']
for modliste in Modulliste:
try:
import modliste
except ImportError:
print type(modliste)
print "Es fehlt das Module" + modliste
sys.exit(1)
Verfasst: Sonntag 18. Oktober 2009, 12:58
von Pekh
Es ist nicht schön, aber du kannst z.B. folgendes schreiben:
Ansonsten schaue dich mal nach der __import__-Funktion um.
Verfasst: Sonntag 18. Oktober 2009, 13:07
von Kinglui
Innerhalb der Doku der __import__ Funktion bin ich nun fündig geworden:
Code: Alles auswählen
Modulliste = ['bla', 'blubb']
modules = map(__import__,Modulliste)
Danke!
Verfasst: Sonntag 18. Oktober 2009, 13:19
von Pekh
Entschuldige, daß ich das jetzt nicht verstanden habe, aber du schreibst lieber zwei Zeilen statt einer?
Verfasst: Sonntag 18. Oktober 2009, 13:25
von Kinglui
nein, aber ich möchte für jedes Modul eine bestimmte print Ausgabe haben.
Wenn ich die hintereinander schreibe geht das ja nicht!?
Verfasst: Sonntag 18. Oktober 2009, 13:31
von Pekh
Code: Alles auswählen
try:
import modul1, modul2, modul3
except ImportError, err:
print err
So in der Art?
Verfasst: Sonntag 18. Oktober 2009, 13:32
von cofi
Kinglui hat geschrieben:Wenn ich die hintereinander schreibe geht das ja nicht!?
So geht das auch nicht, du musst schon eine eigene import-Funktion schreiben, die sich dann auch noch um die Ausgabe kuemmert, allerdings finde ich
Code: Alles auswählen
>>> mods = ['sys', 'os', 'bullshit', 'not_here']
>>> failed = list()
>>> for mod in mods:
... try:
... __import__(mod)
... except ImportError:
... failed.append(mod)
... else:
... print "Failed to import: {0}".format(" ".join(failed))
... exit(1)
...
...
...
<module 'sys' (built-in)>
<module 'os' from '/usr/lib/python2.6/os.pyc'>
Failed to import: bullshit not_here
schoener, da es alle fehlenden abfaengt.
@Pekh: Das nimmt auch nur das erste fehlende mit.
Verfasst: Sonntag 18. Oktober 2009, 13:40
von EyDu
Also ich finde "modliste" ja ein reichlich seltsamen Bezeichner für den Namen eines einzelnen Moduls. Wenn du unbedingt jedes Modul einzeln behandeln möchtest, dann würde ich so etwas schreiben:
Die Funktion musst du natürlich noch füllen, aber das ist im Prinzip nur der Inhalt deiner bisherigen for-Schleife und "__import__". Möchtest du eine Liste haben, kannst du natürlich ggf. ein Tupel zurückliefern (Erfolgsfall), aber vorher in "checked_import" alle Fehler sammeln. (Edit: wie beispielsweise bei cofi).
Wenn du nur Ausgabe produzierst, dann kannst du es auch gleich weglassen:
Code: Alles auswählen
>>> try:
... import sys
... import spam
... except ImportError, error:
... print error
...
No module named spam
Verfasst: Sonntag 18. Oktober 2009, 14:23
von HWK
@cofi: Was soll denn das
else. Die For-Schleife wird doch immer bis zum Schluss durchlaufen, d.h. der else-Teil immer ausgeführt, da kein
break vorhanden ist. Du meinst wohl eher etwas wie
Code: Alles auswählen
if failed:
print "Failed to import: {0}".format(" ".join(failed))
MfG
HWK
Verfasst: Sonntag 18. Oktober 2009, 15:19
von cofi
Ich spiele gerne mit scheinbar unbekannten Elementen

Aber ja, es war ueberfluessig und die Ueberpruefung von `failed` macht mehr Sinn.
Aber lass mir doch meinen Spass

Verfasst: Sonntag 18. Oktober 2009, 20:38
von Kinglui
Danke für die Anregungen!
Verfasst: Montag 19. Oktober 2009, 08:52
von str1442
Wobei __import__() das Modul nur zurückliefert und es nicht automatisch in den (globalen) Namensraum einträgt. Willst du also __import__() benutzen, musst du sowas wie "globals()[mod] = __import__(mod)" benutzen.