Windows Import Problem

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
julianibus
User
Beiträge: 16
Registriert: Montag 21. Juni 2010, 13:04
Wohnort: Aschaffenburg
Kontaktdaten:

Hallo,
auf Linux hab ich die letzten Monate an einem größeren Spiel gearbeitet und möchte es nun auch auf Windows spielbar machen. Ich habe Pygame verwendet und da python und pygame cross-platform sind sollte dies kein allzugroßes Problem sein.

Es habert an einer Stelle im Programm: Zur Laufzeit importiere ich Module, die das Level im Spiel bestimmen.
Und zwar so:

Code: Alles auswählen

lev = __import__(os.path.join(str("levels/", cfg.get("script"))))
cfg.get("mission","script") ist der relative Pfad zum Levelmodul, der in einer Config-Datei festgelegt wird, die so aussieht:

Code: Alles auswählen

script = scripts/tutorial
So funktioniert das unter Linux und Mac OS wunderbar.
Nur unter Windows will es nicht klappen:

Fehler:

Code: Alles auswählen

ImportError: No module named levels\scripts\tutorial
Wenn ich Slash zu Backslash mache, keine Änderung.
Weiß jemand voran das liegt und wie ich das beheben kann?

achja: Das Modul ist natürlich da: ...\levels\scripts\tutorial.py

lg julianibus
BlackJack

@julianibus: Du gehst davon aus, dass sich das Verzeichnis, in dem sich das `levels`-Verzeichnis befindet, auch im Arbeitsverzeichnis des Prozesses befindet. Das muss aber nicht der Fall sein -- auch unter den anderen Systemen nicht!

Man könnte die Daten relativ zu einem Modul angeben, dessen Dateinamen im `__file__`-Attribut findet.
julianibus
User
Beiträge: 16
Registriert: Montag 21. Juni 2010, 13:04
Wohnort: Aschaffenburg
Kontaktdaten:

Das ist mir klar.
da die Pfade relativ sind, starte ich das Programm ja vom RICHTIGEN Verzeichnis aus, auch unter Windows. Daran liegt es nicht.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Das "aus dem richtigen Verzeichnis ausführen" funktioniert unter Windows IIRC nur verlässlich aus der Eingabeaufforderung raus. Beim "Doppelklicken" muss das nicht der Fall sein.

Daher solltest du, wie BlackJack schon schrieb, auf __file__ setzen.

Grüße ... bwbg
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
julianibus
User
Beiträge: 16
Registriert: Montag 21. Juni 2010, 13:04
Wohnort: Aschaffenburg
Kontaktdaten:

Natürlich muss man das noch von der Kommandozeile aus starten wegen dem relativen Pfad. Soäter werde ich mit auch __file__ achauen, aber das ist noch nicht das Problem, das ich habe. Wie importiere ich unter Windows ein Modul zur Laufzeit? Das im ersten Post Beschriebene funktioniert nicht, obweohl ich das Programm von der Kommandozeile starte und zwar so, das die relativen Pfadangaben stimmen.

lg julianibus
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

julianibus hat geschrieben:Und zwar so:

Code: Alles auswählen

lev = __import__(os.path.join(str("levels/", cfg.get("script"))))
Das funktioniert unter Linux? str("levels", ..) sollte nen TypError werfen.
julianibus hat geschrieben:Fehler:

Code: Alles auswählen

ImportError: No module named levels\scripts\tutorial
Natürlich ist levels\scripts... kein Python Modul.
In Python kommt man mit level.scripts.tutorial an tutorial.py im Ordner scripts im Ordner levels, sowohl bei der Benutzung von import wie __import__. Das ist aber auch bei Linux nicht anders.
Antworten