124 votes

Python Nez D'Erreur D'Importation

Je n'arrive pas à obtenir le nez cadre des tests de 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 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 init.py fichiers sont vides

Si j'exécute nosetests -vv dans le répertoire principal (où foo.py est), 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)

Je reçois le même message d'erreur quand je le lance à partir de l'intérieur du répertoire tests/. D'après la documentation et un exemple que j'ai trouvé, le nez est censé ajouter tous les packages de parent pour le chemin d'accès ainsi que le répertoire à partir duquel il est appelé, mais cela ne semble pas être le cas dans mon cas.

Je suis sur Ubuntu 8.04 avec Python 2.6.2. J'ai construit et installé nez manuellement (pas avec setup_tools) si ce qui compte.

231voto

ire_and_curses Points 32802

Vous avez un __init__.py dans votre répertoire de niveau supérieur. Cela en fait un paquet. Si vous l'enlevez, vos nosetests devrait fonctionner.

Si vous ne la retirez pas, vous devrez changer votre import de import dir.foodir est le nom de votre répertoire.

35voto

toppur Points 65

Êtes-vous dans un virtualenv? Dans mon cas, nosetests a la une en /usr/bin/nosetests, qui a été à l'aide de /usr/bin/python. Les paquets dans le virtualenv certainement ne pas être dans le chemin d'accès système. Le fixe suivant ceci:

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

14voto

robbrit Points 7531

Pour ceux d'entre vous à trouver cette question plus tard: je reçois un message d'erreur d'importation si je n'ai pas d' __init__.py fichier dans mon répertoire tests.

Ma structure de répertoire était comme ça:

./tests/
  ./test_some_random_stuff.py

Si j'ai couru nosetests:

nosetests -w tests

Il donnerait l' ImportError que tout le monde le voit. Si j'ajoute un vide __init__.py fichier, ça fonctionne très bien:

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

11voto

Aron Ahmadia Points 515

Un autre problème qui semble être des traits d'union/tirets dans l'arborescence de répertoire. J'ai récemment fixé un nez ImportError problème en renommant un répertoire à partir d' sub-dir de sub_dir.

4voto

hobs Points 3020

Bien sûr, si vous avez une erreur de syntaxe dans le module importé qui sera la cause de cela. Pour moi le problème a élevé sa tête quand j'avais fait une sauvegarde de l'un des tests de fichier avec un chemin comme module/tests.bak.py dans le même répertoire que tests.py. Aussi, pour faire face à l' init package/module de problème dans un Django app, vous pouvez exécuter la ligne suivante (dans un bash/OSX shell) assurez-vous que vous n'avez pas de init.pyc fichiers qui traînent:

find . -name '*.pyc' -delete

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X