Jeg kjører Python 2.5.
Dette er mappetreet mitt:
ptdraft/
nib.py
simulations/
life/
life.py
(Jeg har også __init__.py
i hver mappe, utelatt her for lesbarhet)
Hvordan importerer jeg nib
-modulen fra innsiden av life
-modulen? Jeg håper det er mulig å gjøre uten å tukle med sys.path.
Merk: Hovedmodulen som kjøres ligger i mappen ptdraft
.
Du kan bruke relativ import (python >= 2.5):
from ... import nib
(Hva er nytt i Python 2.5) PEP 328: Absolutt og relativ import
EDIT: lagt til en annen prikk '.' for å gå opp to pakker
Det ser ut til at problemet ikke er relatert til at modulen er i en overordnet katalog eller noe lignende.
Du må legge til katalogen som inneholder ptdraft
i PYTHONPATH.
Du sa at import nib
fungerte med deg, det betyr sannsynligvis at du la til ptdraft
selv (ikke dens overordnede) til PYTHONPATH.
Hvis det ikke fungerte å legge til modulmappen din i PYTHONPATH, kan du endre sys.path-listen i programmet ditt der Python-tolken søker etter modulene som skal importeres, sier python-dokumentasjonen:
Når en modul med navnet spam importeres, søker tolken først etter en innebygd modul med det navnet. Hvis den ikke blir funnet, søker den etter en fil med navnet spam.py i en liste over kataloger gitt av variabelen sys.path. sys.path initialiseres fra disse plasseringene:
- katalogen som inneholder inndataskriptet (eller den gjeldende katalogen).
- PYTHONPATH (en liste over katalognavn, med samme syntaks som skallvariabelen PATH).
- den installasjonsavhengige standarden.
Etter initialisering kan Python-programmer endre sys.path. Katalogen som inneholder skriptet som kjøres, plasseres i begynnelsen av søkestien, foran standard biblioteksti. Dette betyr at skript i den katalogen lastes inn i stedet for moduler med samme navn i bibliotekskatalogen. Dette er en feil med mindre erstatningen er tilsiktet.
Når du vet dette, kan du gjøre følgende i programmet ditt:
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