Üst klasörden modülleri içe aktarma

Python 2.5 çalıştırıyorum.

Bu benim klasör ağacım:

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

(Ayrıca her klasörde __init__.py var, okunabilirlik için burada atlandı)

nibmodülünülife` modülünün içinden nasıl içe aktarabilirim? sys.path ile uğraşmadan bunu yapmanın mümkün olduğunu umuyorum.

Not: Çalıştırılan ana modül ptdraft klasöründedir.

Göreceli içe aktarımları kullanabilirsiniz (python >= 2.5):

from ... import nib

(Python 2.5'teki Yenilikler) PEP 328: Mutlak ve Göreceli İçe Aktarmalar

EDIT: iki paket yukarı çıkmak için başka bir nokta '.' eklendi

Yorumlar (10)
Çözüm

Görünüşe göre sorun modülün bir üst dizinde olmasıyla ya da buna benzer bir şeyle ilgili değil.

PYTHONPATHeptdraft` içeren dizini eklemeniz gerekir

import nibin sizde çalıştığını söylediniz, bu muhtemelenptdraft`ın kendisini (üstünü değil) PYTHONPATH'e eklediğiniz anlamına gelir.

Yorumlar (2)

Modül klasörünüzü PYTHONPATH'e eklemek işe yaramadıysa, Python yorumlayıcısının içe aktarılacak modülleri aradığı programınızdaki sys.path listesini değiştirebilirsiniz, python belgeleri diyor:

gt;spam isimli bir modül içe aktarıldığında, yorumlayıcı ilk olarak bu isimde yerleşik bir modül arar. Bulamazsa, sys.path değişkeni tarafından verilen dizin listesinde spam.py adlı bir dosya arar. sys.path bu konumlardan başlatılır:

  • girdi betiğini içeren dizin (veya geçerli dizin).
  • PYTHONPATH (kabuk değişkeni PATH ile aynı sözdizimine sahip bir dizin adları listesi).
  • kuruluma bağlı varsayılan.

Başlatma işleminden sonra Python programları sys.path dosyasını değiştirebilir. Çalıştırılan betiği içeren dizin, arama yolunun başına, standart kütüphane yolunun önüne yerleştirilir. Bu, kütüphane dizinindeki aynı adlı modüller yerine bu dizindeki betiklerin yükleneceği anlamına gelir. Değiştirme amaçlanmadığı sürece bu bir hatadır.

Bunu bilerek, programınızda aşağıdakileri yapabilirsiniz:

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