Python Nose Import Error
Solution 1
You've got an __init__.py
in your top level directory. That makes it a package. If you remove it, your nosetests
should work.
If you don't remove it, you'll have to change your import
to import dir.foo
, where dir
is the name of your directory.
Solution 2
Are you in a virtualenv? In my case, nosetests
was the one in /usr/bin/nosetests
, which was using /usr/bin/python
. The packages in the virtualenv definitely won't be in the system path. The following fixed this:
source myvirtualenv/activate
pip install nose
which nosetests
/home/me/myvirtualenv/bin/nosetests
Solution 3
To those of you finding this question later on: I get the import error if I don't have an __init__.py
file in my tests directory.
My directory structure was like this:
./tests/
./test_some_random_stuff.py
If I ran nosetests:
nosetests -w tests
It would give the ImportError
that everyone else is seeing. If I add a blank __init__.py
file it works just fine:
./tests/
./__init__.py
./test_some_random_stuff.py
Solution 4
Another potential problem appears to be hyphens/dashes in the directory tree. I recently fixed a nose ImportError issue by renaming a directory from sub-dir
to sub_dir
.
Solution 5
I got this error message because I run the nosetests
command from the wrong directory.
Silly, but happens.
halfak
Updated on May 29, 2020Comments
-
halfak about 4 years
I can't seem to get the nose testing framework to recognize modules beneath my test script in the file structure. I've set up the simplest example that demonstrates the problem. I'll explain it below.
Here's the the package file structure:
./__init__.py ./foo.py ./tests ./__init__.py ./test_foo.py
foo.py contains:
def dumb_true(): return True
tests/test_foo.py contains:
import foo def test_foo(): assert foo.dumb_true()
Both init.py files are empty
If I run
nosetests -vv
in the main directory (where foo.py is), I get: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)
I get the same error when I run from inside the tests/ directory. According to the documentation and an example I found, nose is supposed to add all parent packages to the path as well as the directory from which it is called, but this doesn't seem to be happening in my case.
I'm running Ubuntu 8.04 with Python 2.6.2. I've built and installed nose manually (not with setup_tools) if that matters.
-
halfak about 14 yearsThat got it. Thanks much! I'd up vote, but apparently I need more reputation.
-
ire_and_curses about 14 yearsNo worries. Welcome to StackOverflow! You can tick the green checkmark to the left if the answer solves your problem.
-
Ralph Sinsuat about 14 years@halfak: Have another upvote on your question then. You too (on your answer), @ire.
-
halfak about 14 yearsGot it. Thanks for the tip :)
-
Aman about 11 years
-
Nakilon about 11 years@Aman, you realize difference between variable identifiers and file names?
-
jon skulski almost 9 yearsAlso mine. Thank you, saved a lot of time.
-
Raffi over 8 yearsfor me
nosetests
was cached bybash
to the system one in/usr/local/bin
(whilewhich nosetests
was giving the proper result). I used this to clear it. -
Bengt over 8 yearsAdditionally, I had to deactivate and activate my virtualenv.
-
Kees Briggs over 8 yearsI have a situation where tests work if init.py in root directory - however, I need that file to be there, and import models.<model_name> still is not found. Test is inside a tests/ directory, and the model I'm trying to test is inside models/ directory... any help would be appreciated.
-
Tom Anderson about 8 yearsIn addition to init.py I had to also remove init.pyc . Then nose was able to import a second class.
-
Juuso Ohtonen over 6 yearsI had a problem with PS1=${PS1:-} set when activating virtualenv (to overcome errors on unset variables). After removing this and switching to set +u, I had no problems anymore.
-
Birdman over 5 yearsYeah...I always have a file that was similar to FooTests.py and it for some reason didn't like it...I renamed to Foo_Tests.py and it worked...seems a bit finicky.
-
gerrit over 5 yearsCan you please add some details to your answer? What directory did you run it from? Why is it wrong? What would be the right directory? Running
nosetests
in a directory with no tests at all will result inRan 0 tests
, not any import error. In its present form this answer is not useful. -
dfrankow over 4 yearsWhat if I don't want to remove
__init__.py
becausefoo.py
has functions that I'd like to import elsewhere, and I don't want to change the imports because then I'll have to set PYTHONPATH differently inside and outside of nose? This question is also at stackoverflow.com/questions/60352884/… -
dfrankow over 4 yearsAlso, why does nose do this, and can I turn off this behavior? Clearly tons of people have trouble with it, since your answer has hundreds of upvotes.