Modules importeren uit bovenliggende map

Ik gebruik Python 2.5.

Dit is mijn mappenstructuur:

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

(Ik heb ook __init__.py in elke map, hier weggelaten voor de leesbaarheid)

Hoe importeer ik de nib module vanuit de life module? Ik hoop dat het mogelijk is zonder te sleutelen aan sys.path.

Opmerking: De hoofdmodule die wordt uitgevoerd staat in de ptdraft map.

Je zou relatieve imports kunnen gebruiken (python >= 2.5):

from ... import nib

(What's New in Python 2.5) PEP 328: Absolute and Relative Imports

EDIT: nog een punt '.' toegevoegd om twee pakketten omhoog te gaan

Commentaren (10)
Oplossing

Het lijkt erop dat het probleem niet te maken heeft met het feit dat de module in een bovenliggende map staat of iets dergelijks.

U moet de directory die ptdraft bevat toevoegen aan PYTHONPATH

U zei dat import nib bij u werkte, dat betekent waarschijnlijk dat u ptdraft zelf (niet zijn parent) heeft toegevoegd aan PYTHONPATH.

Commentaren (2)

Als het toevoegen van uw module map aan het PYTHONPATH niet werkte, kunt u de sys.path lijst in uw programma aanpassen waar de Python interpreter zoekt naar de modules om te importeren, zegt de python documentatie:

Wanneer een module met de naam spam wordt geïmporteerd, zoekt de interpreter eerst naar een ingebouwde module met die naam. Als deze niet wordt gevonden, wordt er gezocht naar een bestand met de naam spam.py in een lijst van mappen die wordt gegeven door de variabele sys.path. sys.path wordt geïnitialiseerd vanuit deze locaties:

  • de directory met het input script (of de huidige directory).
  • PYTHONPATH (een lijst van directorynamen, met dezelfde syntaxis als de shell variabele PATH).
  • de installatie-afhankelijke standaard.

Na initialisatie kunnen Python programma's sys.path wijzigen. De directory met het script dat wordt uitgevoerd wordt aan het begin van het zoekpad geplaatst, vóór het standaard bibliotheekpad. Dit betekent dat scripts in die directory geladen zullen worden in plaats van modules met dezelfde naam in de bibliotheek directory. Dit is een fout, tenzij de vervanging bedoeld is.

Dit wetende, kunt u het volgende doen in uw programma:

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
Commentaren (3)