Seite 1 von 1

Relativer Import - Wie?

Verfasst: Donnerstag 8. November 2007, 14:36
von moadin
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

Verfasst: Donnerstag 8. November 2007, 14:41
von lutz.horn
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.

Verfasst: Donnerstag 8. November 2007, 17:27
von Leonidas
lutz.horn hat geschrieben:Setze die Umgebungsvariable PYTHON_PATH, so dass sie lib/ enthält.
Die heißt `PYTHONPATH` (also `%PYTHONPATH%` und `$PYTHONPATH`).

Verfasst: Freitag 9. November 2007, 11:59
von moadin
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

Verfasst: Freitag 9. November 2007, 12:28
von Leonidas
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.

Verfasst: Freitag 9. November 2007, 15:35
von birkenfeld
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.