Module aus übergeordnetem Ordner importieren

Ich verwende Python 2.5.

Dies ist mein Ordnerbaum:

ptdraft/
  nib.py
  simulations/
    life/
      life.py

(Ich habe auch __init__.py in jedem Ordner, hier zur besseren Lesbarkeit weggelassen)

Wie importiere ich das Modul nib innerhalb des Moduls life? Ich hoffe, es ist möglich, ohne an sys.path herumzubasteln.

Hinweis: Das Hauptmodul, das ausgeführt wird, befindet sich im Ordner ptdraft.

Sie könnten relative Importe verwenden (python >= 2.5):

from ... import nib

(Was ist neu in Python 2.5) PEP 328: Absolute und relative Importe

EDIT: einen weiteren Punkt '.' hinzugefügt, um zwei Pakete hochzugehen

Kommentare (10)
Lösung

Es scheint, dass das Problem nicht damit zusammenhängt, dass sich das Modul in einem übergeordneten Verzeichnis oder ähnlichem befindet.

Sie müssen das Verzeichnis, das ptdraft enthält, zum PYTHONPATH hinzufügen

Sie sagten, dass import nib bei Ihnen funktioniert hat, das bedeutet wahrscheinlich, dass Sie ptdraft selbst (nicht sein Elternteil) zum PYTHONPATH hinzugefügt haben.

Kommentare (2)

Wenn das Hinzufügen Ihres Modulordners zum PYTHONPATH nicht funktioniert hat, können Sie die sys.path-Liste in Ihrem Programm ändern, in der der Python-Interpreter nach den zu importierenden Modulen sucht, so die Python-Dokumentation:

Wenn ein Modul namens spam importiert wird, sucht der Interpreter zuerst nach einem eingebauten Modul mit diesem Namen. Wenn es nicht gefunden wird, sucht er nach einer Datei mit dem Namen spam.py in einer Liste von Verzeichnissen, die durch die Variable sys.path angegeben wird. sys.path wird von diesen Orten aus initialisiert:

  • das Verzeichnis, das das Eingabeskript enthält (oder das aktuelle Verzeichnis).
  • PYTHONPATH (eine Liste von Verzeichnisnamen, mit der gleichen Syntax wie die Shell-Variable PATH).
  • die installationsabhängige Voreinstellung.

Nach der Initialisierung können Python-Programme sys.path verändern. Das Verzeichnis, das das auszuführende Skript enthält, wird an den Anfang des Suchpfades gesetzt, noch vor dem Pfad der Standardbibliothek. Das bedeutet, dass Skripte in diesem Verzeichnis anstelle von gleichnamigen Modulen im Bibliotheksverzeichnis geladen werden. Dies ist ein Fehler, es sei denn, die Ersetzung ist beabsichtigt.

Wenn Sie dies wissen, können Sie in Ihrem Programm Folgendes tun

import sys
# Add the ptdraft folder path to the sys.path list
sys.path.append('/path/to/ptdraft/')

# Now you can import your module
from ptdraft import nib
# Or just
import ptdraft
Kommentare (3)