Errore di importazione del naso Python


121

Non riesco a far sì che il framework di test del naso riconosca i moduli sotto il mio script di test nella struttura del file. Ho impostato l'esempio più semplice che dimostra il problema. Lo spiegherò di seguito.

Ecco la struttura del file del pacchetto:

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

foo.py contiene:

def dumb_true():
    return True

tests / test_foo.py contiene:

import foo

def test_foo():
    assert foo.dumb_true()

Entrambi i file init .py sono vuoti

Se nosetests -vveseguo nella directory principale (dove si trova foo.py), ottengo:

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)

Ottengo lo stesso errore quando eseguo dalla directory tests /. Secondo la documentazione e un esempio che ho trovato, nose dovrebbe aggiungere tutti i pacchetti genitore al percorso così come la directory da cui è chiamato, ma questo non sembra accadere nel mio caso.

Uso Ubuntu 8.04 con Python 2.6.2. Ho costruito e installato il naso manualmente (non con setup_tools) se è importante.

Risposte:


226

Hai un __init__.pynella tua directory di primo livello. Questo lo rende un pacchetto. Se lo rimuovi, il tuo nosetestsdovrebbe funzionare.

Se non lo rimuovi, dovrai cambiare il tuo importin import dir.foo, dov'è diril nome della tua directory.


7
Ecco fatto. Grazie mille Vorrei votare, ma a quanto pare ho bisogno di più reputazione.
halfak

4
Nessun problema. Benvenuto in StackOverflow! Puoi spuntare il segno di spunta verde a sinistra se la risposta risolve il tuo problema.
ire_and_curses

2
@halfak: Allora dai un altro voto positivo alla tua domanda. Anche tu (sulla tua risposta), @ire.
Mark Rushakoff

1
Fatto. Grazie per il suggerimento :)
halfak

5
Ho una situazione in cui i test funzionano se init .py nella directory principale, tuttavia, ho bisogno che quel file sia lì e che importi i modelli. <model_name> ancora non viene trovato. Test è all'interno di una directory tests / e il modello che sto cercando di testare è all'interno di models / directory ... qualsiasi aiuto sarebbe apprezzato.
Kees Briggs

32

Sei in un virtualenv? Nel mio caso, nosetestsera quello in /usr/bin/nosetests, che stava usando /usr/bin/python. I pacchetti in virtualenv sicuramente non saranno nel percorso di sistema. Quanto segue ha risolto questo problema:

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

2
Anche mio. Grazie, hai risparmiato molto tempo.
jskulski

3
per me è nosetestsstato memorizzato nella cache bashdel sistema in /usr/local/bin(mentre which nosetestsstava dando il risultato corretto). Ho usato questo per cancellarlo.
Raffi

5
Inoltre, ho dovuto disattivare e attivare il mio virtualenv.
Bengt,

Ho avuto un problema con PS1 = $ {PS1: -} impostato durante l'attivazione di virtualenv (per superare gli errori sulle variabili non impostate). Dopo averlo rimosso e passato a set + u , non ho più avuto problemi.
Juuso Ohtonen

13

A quelli di voi che trovano questa domanda in seguito: ottengo l'errore di importazione se non ho un __init__.pyfile nella mia directory dei test.

La struttura della mia directory era così:

./tests/
  ./test_some_random_stuff.py

Se ho eseguito nosetest:

nosetests -w tests

Darebbe quello ImportErrorche tutti gli altri stanno vedendo. Se aggiungo un __init__.pyfile vuoto , funziona bene:

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

10

Un altro potenziale problema sembra essere rappresentato dai trattini / trattini nell'albero delle directory. Recentemente ho risolto un problema di ImportError del naso rinominando una directory da sub-dira sub_dir.



1
@ Aman, ti rendi conto della differenza tra identificatori di variabili e nomi di file?
Nakilon

Sì ... ho sempre un file simile a FooTests.py e per qualche motivo non mi è piaciuto ... Ho rinominato Foo_Tests.py e ha funzionato ... sembra un po 'complicato.
Birdman

3

Ovviamente se hai un errore di sintassi nel modulo che viene importato, ciò causerà questo. Per me il problema ha sollevato la testa quando ho avuto un backup di un file di test con un percorso come module / tests.bak.py nella stessa directory di tests.py. Inoltre, per affrontare il problema del pacchetto / modulo init in un'app Django, puoi eseguire quanto segue (in una shell bash / OSX) per assicurarti di non avere alcun file init .pyc in giro:

find . -name '*.pyc' -delete

3

Ho ricevuto questo messaggio di errore perché eseguo il file nosetests comando dalla directory sbagliata.

Sciocco, ma succede.


Puoi aggiungere alcuni dettagli alla tua risposta? Da quale directory l'hai eseguito? Perché è sbagliato? Quale sarebbe la directory giusta? L'esecuzione nosetestsin una directory senza alcun test comporterà Ran 0 testsalcun errore di importazione. Nella sua forma attuale questa risposta non è utile.
gerrit

2

Mi sono appena imbattuto in un'altra cosa che potrebbe causare questo problema: la denominazione dei test nel modulo testname.test.py. Quel extra .confonde il naso e lo porta a importare cose che non dovrebbe. Suppongo che possa essere ovvio che l'uso di convenzioni di denominazione dei test non convenzionali rompa le cose, ma ho pensato che potrebbe valere la pena notare.


2

Ad esempio, con la seguente struttura di directory, se si desidera eseguire nosetestsin m1, m2o m3per testare alcune funzioni in n.py, si dovrebbe usare from m2.m3 import nin test.py.

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

1

Solo per completare la domanda: se stai lottando con una struttura come questa:

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

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

E forse vuoi eseguire il test da un percorso esterno al progetto, includere il percorso del progetto all'interno di PYTHONPATH.

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

incollalo all'interno del tuo .profile. Se ti trovi in ​​un ambiente virtuale, incollalo all'interno dell'attivazione nella tua venv root

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.