dynamisches laden von modulen mit __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
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

Hallo,
ich versuche aus dem Package "Dev" ein Script mit __import__ dynamisch zu laden.

Code: Alles auswählen

def fun(self, Block):
        Name = "Dev." + Block + ".Param"
        Modul = __import__(Name)
        #import Dev.BlockName.Param as Modul

        print getattr(Modul, 'default')

fun(BlockName)
Es kommt dann die Fehlermeldung: "AttributeError: 'module' object has no attribute 'default' "
wenn ich den dynamischen Import durch die auskommentierte Zeile ersetze klappt es aber.
die Datei "Param.py" hat den Inhalt:

Code: Alles auswählen

default = ['Value 1\n', 'Value 2\n']
Zuletzt geändert von hypnoticum am Donnerstag 7. April 2011, 20:35, insgesamt 1-mal geändert.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Du machst mit deinem Funktionsaufruf `import Dev.Block.Param`, also musst du auch auf `Dev.Block.Param.default` zugreifen... Hier ist auch ein Beispiel wie du das mit `as` alternativ lösen kannst:
http://docs.python.org/library/functions.html#__import__

Ach ja, schau dir mal PEP-8 an, Module und Pakete sollte man nicht mit Großbuchstaben bezeichnen.
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

@ms4py:
Danke für die schnelle Antwort und den Tip, nur leider verstehe ich nicht was du meinst ...
kannst du das bitte in Quelltext umsetzen? Sind ja nur ein paar Zeilen
deets

Der Quelltext steht in der verlinkten Seite. Muss man ja nur ein bisschen lesen.
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

So gehts:

Code: Alles auswählen

def fun(self, Block):
        Name = "Dev." + Block + ".Param"
        Modul = __import__(Name,  globals(), locals(), ['default'])

        print getattr(Modul, 'default')

fun(BlockName)
Antworten