Python Nose Import Error

52,695

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.

Share:
52,695
halfak
Author by

halfak

Updated on May 29, 2020

Comments

  • halfak
    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
    halfak about 14 years
    That got it. Thanks much! I'd up vote, but apparently I need more reputation.
  • ire_and_curses
    ire_and_curses about 14 years
    No worries. Welcome to StackOverflow! You can tick the green checkmark to the left if the answer solves your problem.
  • Ralph Sinsuat
    Ralph Sinsuat about 14 years
    @halfak: Have another upvote on your question then. You too (on your answer), @ire.
  • halfak
    halfak about 14 years
    Got it. Thanks for the tip :)
  • Aman
    Aman about 11 years
  • Nakilon
    Nakilon about 11 years
    @Aman, you realize difference between variable identifiers and file names?
  • jon skulski
    jon skulski almost 9 years
    Also mine. Thank you, saved a lot of time.
  • Raffi
    Raffi over 8 years
    for me nosetests was cached by bash to the system one in /usr/local/bin (while which nosetests was giving the proper result). I used this to clear it.
  • Bengt
    Bengt over 8 years
    Additionally, I had to deactivate and activate my virtualenv.
  • Kees Briggs
    Kees Briggs over 8 years
    I 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
    Tom Anderson about 8 years
    In addition to init.py I had to also remove init.pyc . Then nose was able to import a second class.
  • Juuso Ohtonen
    Juuso Ohtonen over 6 years
    I 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
    Birdman over 5 years
    Yeah...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
    gerrit over 5 years
    Can 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 in Ran 0 tests, not any import error. In its present form this answer is not useful.
  • dfrankow
    dfrankow over 4 years
    What if I don't want to remove __init__.py because foo.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
    dfrankow over 4 years
    Also, 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.