Python Burun İçe Aktarma Hatası


121

Dosya yapısındaki test komutumun altındaki modülleri tanımak için burun testi çerçevesini alamıyorum . Sorunu gösteren en basit örneği oluşturdum. Aşağıda açıklayacağım.

Paket dosyası yapısı şu şekildedir:

./__init__.py
./foo.py
./tests
   ./__init__.py
   ./test_foo.py

foo.py şunları içerir:

def dumb_true():
    return True

testler / test_foo.py şunları içerir:

import foo

def test_foo():
    assert foo.dumb_true()

Her iki init .py dosyası boş

Koşarsam nosetests -vv(foo.py olduğu) ana dizinde, alıyorum:

Failure: ImportError (No module named foo) ... ERROR

======================================================================
ERROR: Failure: ImportError (No module named foo)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/loader.py", line 379, in loadTestsFromName
    addr.filename, addr.module)
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/importer.py", line 39, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/importer.py", line 86, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File "/home/user/nose_testing/tests/test_foo.py", line 1, in <module>
    import foo
ImportError: No module named foo

----------------------------------------------------------------------
Ran 1 test in 0.002s

FAILED (errors=1)

Testler / dizininin içinden çalıştırdığımda da aynı hatayı alıyorum. Dokümantasyona ve bulduğum bir örneğe göre , burnun tüm üst paketleri yolun yanı sıra çağrıldığı dizine eklemesi gerekiyor, ancak bu benim durumumda gerçekleşmiyor gibi görünüyor.

Python 2.6.2 ile Ubuntu 8.04 çalıştırıyorum. Eğer önemliyse, burnu elle oluşturdum ve kurdum (setup_tools ile değil).

Yanıtlar:


226

En __init__.pyüst düzey dizininizde bir var. Bu onu bir paket yapar. Kaldırırsan, nosetestsçalışmalısın.

Bunu kaldırmak yoksa, size değiştirmek gerekecek importTo import dir.foo, dirsenin dizinin adıdır.


7
Anladım. Çok teşekkürler! Oy verirdim ama görünüşe göre daha fazla itibara ihtiyacım var.
halfak

4
Telaşa gerek yok. StackOverflow'a hoş geldiniz! Cevap sorununuzu çözerse, soldaki yeşil onay işaretini işaretleyebilirsiniz.
ire_and_curses

2
@halfak: O zaman sorunuza başka bir olumlu oy verin. Sen de (cevabına göre) @ire.
Mark Rushakoff

1
Anladım. Bahşiş için teşekkürler :)
halfak

5
Ben eğer testler çalışmak bir durum var init kök dizininde .py - ancak, gerek o dosya orada olmak ve ithalat modelleri <MODEL_NAME>. Hala bulunamadı. Test bir testler / dizini içindedir ve test etmeye çalıştığım model modeller / dizininin içinde ... herhangi bir yardım memnuniyetle karşılanacaktır.
Kees Briggs

32

Bir sanal ortamda mısınız? Benim durumumda, nosetestsbirdi /usr/bin/nosetestskullanıyordum, /usr/bin/python. Virtualenv'deki paketler kesinlikle sistem yolunda olmayacaktır. Aşağıdakiler bunu düzeltti:

source myvirtualenv/activate
pip install nose
which nosetests
/home/me/myvirtualenv/bin/nosetests

2
Benim de. Teşekkürler, çok zaman kazandım.
jskulski

3
benim için sistemde bire nosetestsönbelleğe alındı ( uygun sonucu verirken). Kullandığım bu temizleyin. bash/usr/local/binwhich nosetests
Raffi

5
Ek olarak, sanal ortamımı devre dışı bırakmam ve etkinleştirmem gerekiyordu.
Bengt

Virtualenv'i etkinleştirirken PS1 = $ {PS1: -} ile bir sorun yaşadım (ayarlanmayan değişkenlerdeki hataların üstesinden gelmek için). Bunu kaldırıp + u setine geçtikten sonra artık sorun yaşamadım.
Juuso Ohtonen

13

Bu soruyu daha sonra bulanlar için: Elimde yoksa içe aktarma hatası alıyorum __init__.py Testler dizinimde .

Dizin yapım şöyleydi:

./tests/
  ./test_some_random_stuff.py

Burun testleri yaparsam:

nosetests -w tests

ImportErrorHerkesin gördüğü şeyi verirdi . Boş bir __init__.pydosya eklersem gayet iyi çalışıyor:

./tests/
  ./__init__.py
  ./test_some_random_stuff.py

10

Diğer bir olası sorun, dizin ağacındaki kısa çizgiler / kısa çizgiler olarak görünmektedir. Yakın zamanda bir dizini den sub-dirolarak yeniden adlandırarak bir burun ImportError sorununu düzelttim sub_dir.



1
@Aman, değişken tanımlayıcılar ve dosya adları arasındaki farkın farkında mısın?
Nakilon

Evet ... Her zaman FooTests.py'ye benzer bir dosyam var ve nedense onu beğenmedim ... Foo_Tests.py olarak yeniden adlandırdım ve işe yaradı ... biraz titiz görünüyor.
Birdman

3

Elbette, içe aktarılan modülde buna neden olacak bir sözdizimi hatası varsa. Benim için sorun, tests.py ile aynı dizinde module / tests.bak.py gibi bir yola sahip bir test dosyasının yedeğini aldığımda başını kaldırdı. Ayrıca, bir Django uygulamasındaki başlatma paketi / modül sorununu çözmek için aşağıdakileri (bir bash / OSX kabuğunda) çalıştırarak ortalıkta herhangi bir init .pyc dosyanız olmadığından emin olabilirsiniz :

find . -name '*.pyc' -delete

3

Bu hata mesajını aldım çünkü nosetests komutu yanlış dizinden .

Aptalca ama olur.


Cevabınıza biraz detay ekleyebilir misiniz? Onu hangi dizinden çalıştırdınız? Neden yanlış? Doğru dizin ne olabilir? nosetestsHiç test Ran 0 testsiçermeyen bir dizinde çalıştırmak , herhangi bir içe aktarma hatasıyla sonuçlanmayacaktır . Mevcut haliyle bu cevap kullanışlı değildir.
gerrit

2

Bu soruna neden olabilecek bir şeye daha rastladım: formdaki testlerin adlandırılması testname.test.py. Bu fazlalık .burnu karıştırır ve yapması gereken şeyleri ithal etmesine neden olur. Sanırım alışılmadık test adlandırma kurallarını kullanmanın bazı şeyleri bozacağı aşikar, ancak kayda değer olduğunu düşündüm.


2

Örneğin, aşağıdaki dizin yapısı ile, çalıştırmak istediğiniz takdirde nosetestsde m1, m2ya m3bazı fonksiyonlarını test n.py, kullanmak gerekir from m2.m3 import niçinde test.py.

m1
└── m2
    ├── __init__.py
    └── m3
        ├── __init__.py
        ├── n.py
        └── test
            └── test.py

1

Sadece soruyu tamamlamak için: Eğer böyle bir yapıyla mücadele ediyorsanız:

project
├── m1
    ├── __init__.py
    ├── foo1.py
    └──m2
       ├── __init__.py
       └── foo2.py

└── test
     ├── __init__.py
     └── test.py

Ve belki de projenin dışındaki bir yoldan test yapmak istersiniz, proje yolunuzu PYTHONPATH'inize dahil edin.

export PYTHONPATH=$PYTHONPATH:$HOME/path/to/project

profilinizin içine yapıştırın. Sanal bir ortamın altındaysanız, bunu venv kökünüzdeki etkinleştirme içine yapıştırın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.