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:

Code: Alles auswählen

import Modul1, Modul2, Modul3
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:

Code: Alles auswählen

spam = checked_import("spam")
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 :twisted:

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.