Falscher Datentyp bei Modul Import

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
Kinglui
User
Beiträge: 7
Registriert: Sonntag 18. Oktober 2009, 12:41

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)
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

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.
Kinglui
User
Beiträge: 7
Registriert: Sonntag 18. Oktober 2009, 12:41

Innerhalb der Doku der __import__ Funktion bin ich nun fündig geworden:

Code: Alles auswählen

Modulliste = ['bla', 'blubb']
modules = map(__import__,Modulliste)
Danke!
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Entschuldige, daß ich das jetzt nicht verstanden habe, aber du schreibst lieber zwei Zeilen statt einer?
Kinglui
User
Beiträge: 7
Registriert: Sonntag 18. Oktober 2009, 12:41

nein, aber ich möchte für jedes Modul eine bestimmte print Ausgabe haben.
Wenn ich die hintereinander schreibe geht das ja nicht!?
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Code: Alles auswählen

try:
  import modul1, modul2, modul3
except ImportError, err:
  print err
So in der Art?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Das Leben ist wie ein Tennisball.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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

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:
Kinglui
User
Beiträge: 7
Registriert: Sonntag 18. Oktober 2009, 12:41

Danke für die Anregungen!
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

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