Relativer Import - Wie?

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.
moadin
User
Beiträge: 2
Registriert: Donnerstag 8. November 2007, 14:12

Relativer Import - Wie?

Beitragvon moadin » Donnerstag 8. November 2007, 14:36

Hallo zusammen,

seit einiger Zeit programmiere ich begeistert in Python und habe mir eine Menge bereits Klassen erstellt.
Diese liegen in meinem Projekt in Eclipse unter /src/lib.

Da sich später verschiedene Programme diese Klassen teilen müssen, erstelle ich für jedes Programm einen eigenen Ordner. Meine Verzeichnisstruktur ist also derzeit folgende:

./lib/__init__.py
./lib/class1.py
./project1/code.py

In meinem Programm code.py will ich jetzt die class1.py importieren, das klappt auch wenn ich aus Eclipse raus starte mit "from lib import class1", aber von Kommandozeile kennt er das dann nicht mehr.
Ich habe nachgelesen und gefunden, dass man auch relative Imports machen kann, aber das funktioniert nicht so recht:

in code.py:
from ..lib import class1

und es folgt dieser Fehler:
ValueError: Attempted relative import in non-package

Es kommt noch in keiner der Dateien __main__ vor (dann soll dieser Fehler wohl auftreten).

Wie könnte ich meine class1 denn sonst noch reinholen?

Danke für Tipps,

Grüße,

moadin
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Beitragvon lutz.horn » Donnerstag 8. November 2007, 14:41

Setze die Umgebungsvariable PYTHON_PATH, so dass sie lib/ enthält. Dann kannst Du mit

Code: Alles auswählen

import lib.class1


die gewünschte Datei importieren.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 8. November 2007, 17:27

lutz.horn hat geschrieben:Setze die Umgebungsvariable PYTHON_PATH, so dass sie lib/ enthält.

Die heißt `PYTHONPATH` (also `%PYTHONPATH%` und `$PYTHONPATH`).
My god, it's full of CARs! | Leonidasvoice vs Modvoice
moadin
User
Beiträge: 2
Registriert: Donnerstag 8. November 2007, 14:12

Beitragvon moadin » Freitag 9. November 2007, 11:59

Hallo Leute,

danke für die Antworten.
Den Python-Path muss ich ja dann schon vor Programmaufruf setzen oder kann ich das auch relativ im Skript machen?

Das Projekt läuft ja auf verschiedenen Rechnern in verschiedenen Verzeichnissen, da wäre der relative Import schon genial...
Gibt es da keine Möglichkeit?

Moadin
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 9. November 2007, 12:28

moadin hat geschrieben:Den Python-Path muss ich ja dann schon vor Programmaufruf setzen oder kann ich das auch relativ im Skript machen?

Nein, du kannst ihn auch innerhalb des Skriptes ändern. Er ist einfach nur eine Liste mit Ordnernamen in `sys.path`.

moadin hat geschrieben:Das Projekt läuft ja auf verschiedenen Rechnern in verschiedenen Verzeichnissen, da wäre der relative Import schon genial...
Gibt es da keine Möglichkeit?

Doch, seit PEP 328 schon. Aber ich habe sowas bis auf den What's New in Python 2.5-Artikel auch noch nie in Aktion gesehen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Freitag 9. November 2007, 15:35

Zu beachten beim relativen Import ist, dass er nur innerhalb von Packages funktioniert. Sprich, das Modul, das importiert, muss als Teil eines Packages geladen werden (darf also insbesondere nicht __main__ sein), und das importierte Modul muss Teil desselben Packages sein.

Beispiel: a/projekt/code.py kann a/lib/class1.py nur importieren, wenn es im Ordner "a" eine __init__.py gibt und code.py z.B. mit "import a.projekt.code" importiert wird.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/

Wer ist online?

Mitglieder in diesem Forum: Google [Bot], mollyman