relative Pfadangaben

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
Bamba
User
Beiträge: 62
Registriert: Dienstag 31. Oktober 2006, 08:48

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.
Bamba
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Bamba
User
Beiträge: 62
Registriert: Dienstag 31. Oktober 2006, 08:48

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.
Bamba
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

wie wäre es dann mit

Code: Alles auswählen

from lib.dein_modul import x
?

Gruß,
Christian
Bamba
User
Beiträge: 62
Registriert: Dienstag 31. Oktober 2006, 08:48

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
Bamba
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
Bamba
User
Beiträge: 62
Registriert: Dienstag 31. Oktober 2006, 08:48

Vielen Dank - jetzt ist auch MIR ein Licht aufgegangen :!:

Danke
Bamba
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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
Bamba
User
Beiträge: 62
Registriert: Dienstag 31. Oktober 2006, 08:48

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
Bamba
BlackJack

Ändere Deine Paketstruktur. Und/oder benutze absolute Imports.
Bamba
User
Beiträge: 62
Registriert: Dienstag 31. Oktober 2006, 08:48

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
Bamba
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.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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