web-dev-qa-db-fra.com

Python Erreur d'importation de nez

Je n'arrive pas à obtenir framework de test de nez pour reconnaître les modules sous mon script de test dans la structure du fichier. J'ai mis en place l'exemple le plus simple qui illustre le problème. Je vais l'expliquer ci-dessous.

Voici la structure du fichier de package:

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

foo.py contient:

def dumb_true():
    return True

tests/test_foo.py contient:

import foo

def test_foo():
    assert foo.dumb_true()

Les deux fichiers init . Py sont vides

Si je lance nosetests -vv dans le répertoire principal (où est foo.py), j'obtiens:

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)

J'obtiens la même erreur lorsque je lance depuis l'intérieur du répertoire tests /. Selon la documentation et n exemple j'ai trouvé, nose est censé ajouter tous les paquets parents au chemin ainsi qu'au répertoire à partir duquel il est appelé, mais cela ne semble pas se produire dans mon Cas.

J'utilise Ubuntu 8.04 avec Python 2.6.2. J'ai construit et installé le nez manuellement (pas avec setup_tools) si cela importe.

117
halfak

Vous avez un __init__.py dans votre répertoire de niveau supérieur. Cela en fait un package. Si vous le supprimez, votre nosetests devrait fonctionner.

Si vous ne le supprimez pas, vous devrez remplacer votre import par import dir.foo, où dir est le nom de votre répertoire.

217
ire_and_curses

Êtes-vous dans un virtualenv? Dans mon cas, nosetests était celui de /usr/bin/nosetests, qui utilisait /usr/bin/python. Les packages dans virtualenv ne seront certainement pas dans le chemin du système. Les problèmes suivants ont résolu ce problème:

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

Pour ceux d'entre vous qui trouveront cette question plus tard: j'obtiens l'erreur d'importation si je n'ai pas de fichier __init__.py Dans mon répertoire de tests.

Ma structure de répertoires était la suivante:

./tests/
  ./test_some_random_stuff.py

Si je faisais des tests de nez:

nosetests -w tests

Cela donnerait le ImportError que tout le monde voit. Si j'ajoute un fichier __init__.py Vierge, cela fonctionne très bien:

./tests/
  ./__init__.py
  ./test_some_random_stuff.py
12
robbrit

Un autre problème potentiel semble être les tirets/tirets dans l'arborescence des répertoires. J'ai récemment résolu un problème d'importation de nez en renommant un répertoire de sub-dir à sub_dir.

10
Aron Ahmadia

J'ai reçu ce message d'erreur car j'exécute la commande nosetests à partir du mauvais répertoire.

C'est idiot, mais ça arrive.

3
Eyal Levin

Bien sûr, si vous avez une erreur de syntaxe dans le module importé, cela provoquera cela. Pour moi, le problème a refait surface quand j'ai eu une sauvegarde d'un fichier de tests avec un chemin comme module/tests.bak.py dans le même répertoire que tests.py. De plus, pour faire face au problème init package/module dans une application Django, vous pouvez exécuter ce qui suit (dans un shell bash/OSX) pour vous assurer de ne pas 'ai pas de fichiers init. pyc qui traînent:

find . -name '*.pyc' -delete
3
hobs

Je viens de rencontrer une autre chose qui pourrait provoquer ce problème: nommer les tests sous la forme testname.test.py. Cet extra . confond le nez et l'amène à importer des choses qu'il ne devrait pas. Je suppose qu'il peut être évident que l'utilisation de conventions de dénomination de test non conventionnelles cassera les choses, mais j'ai pensé que cela valait la peine d'être noté.

2
7yl4r

Par exemple, avec la structure de répertoires suivante, si vous souhaitez exécuter nosetests dans m1, m2 ou m3 pour tester certaines fonctions dans n.py, Tu devrais utiliser from m2.m3 import n dans test.py.

m1
└── m2
    ├── __init__.py
    └── m3
        ├── __init__.py
        ├── n.py
        └── test
            └── test.py
2
Che-Hsun Liu

Juste pour compléter la question: si vous avez du mal avec une structure comme celle-ci:

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

Et peut-être que vous souhaitez exécuter le test à partir d'un chemin en dehors du projet, incluez votre chemin de projet dans votre PYTHONPATH.

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

collez-le dans votre .profile. Si vous êtes sous un environnement virtuel, collez-le à l'intérieur de l'activer dans votre racine venv

1
Rainelz