2010-02-24 23 views
77

Bu ImportError hatasını düzeltmenin doğru yolu nedir? Python'da "ImportError: Modül yok ..." hatası nasıl düzeltilir?

aşağıdaki dizin yapısı vardır:

/home/bodacydo 
/home/bodacydo/work 
/home/bodacydo/work/project 
/home/bodacydo/work/project/programs 
/home/bodacydo/work/project/foo 

Ve ben

python ./programs/my_python_program.py 

anında olsun yazarsanız

/home/bodacydo/work/project 

Şimdi dizinde duyuyorum

ImportError: No module named foo.tasks 
- Orada olduğunu piton ./foo/tasks.py bulamazlar neden

from foo.tasks import my_function 

anlayamıyorum:

./programs/my_python_program.py aşağıdaki satırı içerir. Ben Python kabuğundan yaparsam

, o zaman çalışır:

python 
>>> from foo.tasks import my_function 

Ben python ./programs/my_python_program.py komut dizisi ile dersek sadece çalışmaz.

cevap

81

Python sys.path geçerli dizini eklemez, aksine senaryo olduğunu dizin. sys.path veya $PYTHONPATH birine /home/bodacydo/work/project ekleyin.

+1

Peki, kök dizinde __init__.py dosyasına sahip olmanın anlamı nedir? Sys.path veya pythonpath dosyasını düzenlerseniz, hiçbir amaca hizmet etmez. –

+7

@Editor: '__init __. Py', yalnızca dizinin bir 'sys.path' içinde olması veya kendi başına bir paket olması durumunda dizinin bir paket olarak ele alınması gerektiğini belirtir. –

+1

Ayrıca klasördeki izinleri de kontrol edin. Benim durumumda sorun buydu. – SidJ

31

Foo dizininde __init__.py adlı bir dosyanız var mı? Değilse python, bir python paketi olarak foo'yu tanımayacaktır.

Daha fazla bilgi için python öğreticisinde section on packages konusuna bakın.

+0

Teşekkürler ve evet, __init __. py' vardı. Sorun bu kez 'PYTHONPATH' ile oldu. Ignacio'nun çözümü işe yaradı. – bodacydo

+1

__init__.py dosyaları, Python'un dizinleri paketleri içerdiği şekilde ele alması için gereklidir; Bu, dizin arama yolunda daha sonra gerçekleşen geçerli modüllerin istemeden gizlenmesinden, dize gibi ortak bir adla dizinleri önlemek için yapılır. En basit durumda, __init__.py sadece boş bir dosya olabilir – panofish

+0

Bir ara beni kurtardığın için teşekkürler. –

2

Aklımda, foo klasörünün tek başına bir kitaplık olduğunu düşünmem gerekiyor. Bir python kurulumunda Lib\site-packages klasörüne taşımayı düşünebilirim. Orada foo.pth dosyasını eklemeyi düşünebilirim.

Ben ./programs/my_python_program.py aşağıdaki satırı içerdiğinden bir kütüphane olduğunu biliyorum:

from foo.tasks import my_function

Yani ./programs ./foo bir kardeş klasör olduğunu fark etmez. Bir adım-adım çözüm İşte

python ./programs/my_python_program.py

7

edilir:

  1. /home/bodacydo/work/project yılında run.py adlı bir komut dosyası ekleyin ve bu şekilde düzenlemek O my_python_program.py böyle bir komut dosyası olarak çalıştırıldığını gerçek: my_python_program da eşdeğer yöntemle

    import programs.my_python_program 
    programs.my_python_program.main() 
    

    (yerine main().)

  2. Git Açıklama

run.py Run

  • /home/bodacydo/work/project için: piton o /home/bodacydo/work/project ekler run.py çalışan, çalıştığı gelen komut yolunu PYTHONPATH için ekler beri. Ve voilà, import foo.tasks bulunacaktır.

  • 7

    Kitaplığı PYTHONPATH öğenize eklemek için örnek bir çözüm.

    export PYTHONPATH="$PYTHONPATH:$HOME/.python" 
    
  • Sonra ~/.python klasörü içine gerekli kütüphane bağlamak, örneğin:

    1. sizin ~/.bashrc ya da sadece doğrudan çalıştırmak içine aşağıdaki satırı ekleyin

      PYTHONPATH ayarlamak yerine bir iyi düzeltme Bu doğru sys.path[0] kurmak ve modülleri yürütmek için daha güvenilir bir yoldur olacak python -m module.path

      kullanmaktır

      ln -s /home/user/work/project/foo ~/.python/ 
      
  • 0

    . Bu python path/to/file.pyPYTHONPATH (sys.path) başında üzerinde path/to koyar olduğu için diğer answerers nedeni söylediğim gibi

    Ben, bu sorunla ilgili bir quick writeup var.

    İlgili konular