Seite 1 von 1

relative Pfadangaben

Verfasst: Dienstag 13. Februar 2007, 14:00
von Bamba
Hallo,

hier der Code:

Code: Alles auswählen

if sys.platform[0:3] == 'win':
  sys.path.append('../lib/')
elif sys.platform[0:5] == 'linux':
  sys.path.append(os.getcwd()+'/../lib/')
Für Linux funktioniert das schonmal, aber unter Windows, klappt es nicht. Wo befindet sich der Fehler, wenn ich dadrunter schreibe

Code: Alles auswählen

from Kampf import *
?

Ich vermute, dass die Pfadangabe einfach nicht stimmt. Wenn ja, wie lautet sie richtig?

Danke.

Verfasst: Dienstag 13. Februar 2007, 14:12
von jens
Warum nutzt du nicht os.name ? Siehe http://docs.python.org/lib/module-os.html#l2h-2569

In welches Verzeichniss willst du denn rein?

bzw. ich würde os.path.join() nutzten...

Verfasst: Dienstag 13. Februar 2007, 14:17
von Bamba
In dem Ordner midkasim liegen wx gui und lib. Die Datei App.py liegt in wx gui. Ich will aber auch module aus lib importieren.

Verfasst: Dienstag 13. Februar 2007, 14:31
von CM
wie wäre es dann mit

Code: Alles auswählen

from lib.dein_modul import x
?

Gruß,
Christian

Verfasst: Dienstag 13. Februar 2007, 14:36
von Bamba
Also:

wx_gui und lib sind unterschiedliche Ordner. wenn ein Script aus wx_gui auf ein Modul im Ordner lib zurückgreifen will, dann muss ich das ja mit .../lib/mein modul machen

Das funktioniert aber nicht!

from lib.dein_modul import geht nicht.

Bamba

Verfasst: Dienstag 13. Februar 2007, 14:44
von CM
Also:
1. Hast Du das im Post vorher nicht geschrieben (da gab es drei Ordner: wx, gui und lib und jetzt gibt es wx_gui und lib) und Du hast nicht geschrieben, daß Du von der GUI aus Module aus lib importieren willst.
2. Ist klar, daß es nicht funktioniert.
3. Würde ich an Deiner Stelle das Design ändern. (Die Hauptapp in den Hauptordner und alles Weitere darunter und keine kreuzimporte.)
4. Jens Tipps werden helfen.

Gruß,
Christian

Verfasst: Dienstag 13. Februar 2007, 14:47
von Bamba
Vielen Dank - jetzt ist auch MIR ein Licht aufgegangen :!:

Danke

Verfasst: Dienstag 13. Februar 2007, 15:18
von Leonidas
Bamba hat geschrieben:Vielen Dank - jetzt ist auch MIR ein Licht aufgegangen :!:
Und jetzt, zusätzlich zu CMs Tipps auch die *-Importe loswerden.

Übrigens, man muss durch PEP 328 solche Pfade nicht mehr in sys.path einfügen.

Verfasst: Dienstag 13. Februar 2007, 18:29
von sape
Leonidas hat geschrieben:[...]
Übrigens, man muss durch PEP 328 solche Pfade nicht mehr in sys.path einfügen.
Danke für den guten Tipp. Das kannte ich noch garnicht. :)

lg

Verfasst: Mittwoch 14. März 2007, 17:06
von Bamba
Ja, ich weiß, dass hier schon wahrscheinlich bessere Vorschläge gemacht wurden, aber ich will halt:

Code: Alles auswählen

if sys.platform[0:3] == 'win':
   sys.path.append('/../lib/')
elif sys.platform[0:5] == 'linux':
   sys.path.append(os.getcwd()+'/../lib/')
nutzen. Ich kriege es aber immer noch nicht hin. Mal unabhängig von der Sache, dass es bessere Möglichkeiten gibt, wie komme ich an ein anderes Modul ran, dass hier liegt:

Im Ordner MidKaSim liegen die Ordner lib und wx_gui. Der Code oben ist aus einer DAtei in wx_gui. Wie komme ich von da an ein Modul in lib ran? Es funktioniert einfach nicht. Bitte helft mir!

bamba

Verfasst: Mittwoch 14. März 2007, 18:07
von BlackJack
Ändere Deine Paketstruktur. Und/oder benutze absolute Imports.

Verfasst: Mittwoch 14. März 2007, 19:57
von Bamba
Unabhängig davon, dass ich es machen sollte - WARUM FUNKTIONIERT DER CODE OBEN NICHT? Es geht mir jetzt darum das einfach zu kapieren.

Danke.

Bamba

Verfasst: Mittwoch 14. März 2007, 20:13
von BlackJack
Weil unter 'C:\lib' nichts entsprechendes liegt? Ich gehe jetzt mal davon aus, das man bei Windows wieder in 'C:\' landet, wenn man versucht im Wurzelverzeichnis des Laufwerks eins höher zu gehen.

Ansonsten könntest Du es doch einfach mal mit ein paar ``print``-Anweisungen versuchen.

Verfasst: Mittwoch 14. März 2007, 20:46
von gerold
Bamba hat geschrieben:Unabhängig davon, dass ich es machen sollte - WARUM FUNKTIONIERT DER CODE OBEN NICHT?
Hallo Bamba!

Vielleicht musst du einfach nur den absoluten Pfad angeben:

Code: Alles auswählen

import os
import sys

APPDIR = os.path.dirname(os.path.abspath(__file__))
LIBDIR = os.path.abspath(os.path.join(APPDIR, "..\\lib"))

sys.path.append(LIBDIR)
mfg
Gerold
:-)

PS: Achtung! __file__ gibt im IDLE nicht den Dateipfad zurück.

Verfasst: Donnerstag 15. März 2007, 06:48
von sape
sape hat geschrieben:
Leonidas hat geschrieben:[...]
Übrigens, man muss durch PEP 328 solche Pfade nicht mehr in sys.path einfügen.
Danke für den guten Tipp. Das kannte ich noch garnicht. :)

lg
Habs getestet und es funktioniert nicht wirklich bei mir :K

Beispiel Struktur:
MyProject
-- logic
---- diverse Python Scripte
-- gui
---- diverse Python Scripte
--unittests
MyWxApp.pyw

Wenn ich MyWxApp.pyw starte, und z.B. ein Script aus dem Package ``gui`` ein Script von dem Package ``logic`` importiert (import logic.foo), geht alles wunderbar, da in ``sys.path`` der Pfad zu ``MyProject`` existiert und somit darüber auf ``gui`` und ``logic`` zurückgegriffen werden kann. Aber, wenn ich nun das betreffende Script in ``gui`` starte (das ja eins aus ``logic`` importiert) dann geht es nicht, da ja der Pfad zu ``MyProject`` nicht in ``sys.path`` existiert. -- Logisch es wurde ja auch aus ``gui`` gestartet und kann daher das Package ``logic`` nicht finden, da der Pfad zum Root-Verzeichnis ``MyProject`` nicht in ``sys.path`` existiert.

Nun habe ich mal einiges aus ``PEP 328`` ausprobiert und nichts hat funktioniert. Naja, ich behelfe mir damit das ich nun weiterhin ``sys.path.append(...)`` benutze um den Pfad zum Root-Verzeichnis ``MyProject`` verfügbar zu machen. -- Das benutze ich natürlich nur bei ``unittest`` weil ich die Scripte aus diesem Packlge immer direkt ausführe!

Verfasst: Donnerstag 15. März 2007, 14:01
von Leonidas
sape hat geschrieben:Nun habe ich mal einiges aus ``PEP 328`` ausprobiert und nichts hat funktioniert.
Hast du die entsprechende Python-Version und den entsprechenden ``__future__``-Import ausgeführt?

Verfasst: Donnerstag 15. März 2007, 17:37
von sape
Leonidas hat geschrieben:
sape hat geschrieben:Nun habe ich mal einiges aus ``PEP 328`` ausprobiert und nichts hat funktioniert.
Hast du die entsprechende Python-Version und den entsprechenden ``__future__``-Import ausgeführt?
Hi Leonidas. Danke für die schnelle Antwort.

Ich habs mit Python 2.5 getestet und habe ``from __future__ import absolute_import`` probiert. Versucht zu importieren habe ich dann z.B. mit ``from .foo import bar``.

Ich kriegte dann jedesmal ein Traceback. Muss das noch mal teste und poste dann den Traceback hier.