Seite 1 von 1
Module zur Laufzeit importieren - Problem
Verfasst: Dienstag 24. August 2010, 14:14
von julianibus
Hi,
unter Linux habe ich bis jetzt Module so zur Laufzeit importiert:
Code: Alles auswählen
def __import__(name, globals=None, locals=None, fromlist=None):
try:
return sys.modules[name]
except KeyError:
pass
fp, pathname, description = imp.find_module(name)
try:
return imp.load_module(name, fp, pathname, description)
finally:
if fp:
fp.close()
Code: Alles auswählen
lev = __import__(os.path.join("levels/scripts/" + level))
miss = lev.mission()
Da hat wunderbar funktioniert. Wenn ich mein Programm unter Windows ausführe kann er das Modul nicht finden. Was stimmt daran nicht und was kann ich tun, damit es auch unter Windows geht?
Danke im Vorraus.
lg julianibus
Re: Module zur Laufzeit importieren - Problem
Verfasst: Dienstag 24. August 2010, 14:45
von BlackJack
@julianibus: Wie startest Du denn das Programm unter Linux und unter Windows? Ist das Arbeitsverzeichnis für das Programm relativ gesehen das gleiche?
Du verwendest `os.path.join()` übrigens falsch. *Damit* sollte man Pfade zusammensetzen, und dann auch *alle* Teile, und der Funktion nicht *einen* Pfad übergeben. Dann ist das ziemlich sinnfrei.
Re: Module zur Laufzeit importieren - Problem
Verfasst: Dienstag 24. August 2010, 20:09
von julianibus
ich wechsle mit beiden Shells in das Verzeichnis, wo das Script, das das Modul einbinden soll, liegt, dann führe ich es unter Linux mit
und unter Windows mit
aus.
Ich dachte os.path.join ist dazu da die Pfadangaben zu "vereinheitlichen", damit diese plattformunabhängig funktionieren.
Re: Module zur Laufzeit importieren - Problem
Verfasst: Dienstag 24. August 2010, 20:19
von cofi
julianibus hat geschrieben:Ich dachte os.path.join ist dazu da die Pfadangaben zu "vereinheitlichen", damit diese plattformunabhängig funktionieren.
Ja. Allerdings indem man die Pfade damit zusammenbaut.
Der genaue Traceback und der inhalt von `sys.path` waere evtl noch hilfreich.
Re: Module zur Laufzeit importieren - Problem
Verfasst: Dienstag 24. August 2010, 20:26
von .robert
cofi hat geschrieben:julianibus hat geschrieben:Ich dachte os.path.join ist dazu da die Pfadangaben zu "vereinheitlichen", damit diese plattformunabhängig funktionieren.
Ja. Allerdings indem man die Pfade damit zusammenbaut.
Um dich mal an die Hand zu nehmen:
Re: Module zur Laufzeit importieren - Problem
Verfasst: Mittwoch 25. August 2010, 08:21
von julianibus
hi,
also:
Code: Alles auswählen
lev = __import__(os.path.join(os.getcwd(),"levels","scripts",level + ".py"))
In der Fehlermeldung bekomme ich damit den vollständig richtigen Pfad zu meinem Python Modul angezeigt, aber es will nicht funktionieren. auch wenn ich das .py weglasse ändert sich nichts.
Die komplette Fehlermeldung:
Code: Alles auswählen
Traceback (most recent call last):
File "main.py", line 729, in <module>
if __name__ == '__main__': main()
File "main.py", line 266, in main
checkmission()
File "main.py", line 537, in checkmission
lev = __import__(os.path.join(os.getcwd(),"levels","scripts",level + ".py"))
File "main.py", line 629, in __import__
fp, pathname, description = imp.find_module(name)
ImportError: No module named C:\Users\julian\Downloads\towerx_0-1\towerx\levels\
scripts\tutorial.py
Re: Module zur Laufzeit importieren - Problem
Verfasst: Mittwoch 25. August 2010, 09:54
von cofi
Und das funktioniert unter Linux? Das kann ich mir nicht sonderlich vorstellen, weil `imp.find_module` laut Docs mit dem Namen und nicht dem Pfad arbeitet.
Versuch mal
Code: Alles auswählen
def load_level(name):
LEVEL_PATH = os.path.join(os.getcwd(),"levels","scripts")
fp, pathname, description = imp.find_module(name, LEVEL_PATH)
try:
return imp.load_module(name, fp, pathname, description)
finally:
if fp:
fp.close()
Edit: 2 Anmerkungen:
1. `LEVEL_PATH` sollte man natuerlich besser ausserhalb der Funktion definieren und eventuell `os.getcwd` durch `os.path.abspath(sys.argv[0])` ersetzen, wenn die Level bei dem Programm liegen sollten.
2. Zu benutzen ist es dann so: