47

I am unable to use nose (nosetests) in a virtualenv project - it can't seem to find the packages installed in the virtualenv environment.

The odd thing is that i can set

test_suite = 'nose.collector'

in setup.py and run the tests just fine as

python setup.py test

but when running nosetests straight, there are all sorts of import errors.

I've tried it with both a system-wide installation of nose and a virtualenv nose package and no luck.

Any thoughts?

Thanks!!

Ryan
  • 1,306
  • 1
  • 13
  • 20
  • On a related note, nose works fine "out of the box" on a different computer... so there's something wonky with the system I was having problems on. – Ryan May 15 '09 at 17:07

9 Answers9

63

You need to have a copy of nose installed in the virtual environment. In order to force installation of nose into the virtualenv, even though it is already installed in the global site-packages, run pip install with the -I flag:

(env1)$ pip install nose -I

From then on you can just run nosetests as usual.

edward
  • 2,455
  • 23
  • 12
  • 12
    It seems that one might have to refresh the virtualenv. Namely, `which nosetests` should point to an executable inside of the virtualenv. – Ceasar Jul 16 '13 at 05:52
  • 20
    +1 This is what worked for me. Also, as Ceasar points out, I also had to refresh the virtualenv by running `deactivate` and then reactivating. – Tom Oct 01 '13 at 16:31
  • 1
    After you use this command, then `deactivate`, then `workon ENV`, it seems you can then use ``python `which nosetests` ``. – David Gay Oct 15 '14 at 05:08
  • When `which nosetests` does not correctly point to the venv, check if you have installed `nose` or `nose2`, and note that `nose2` does not use the `nosetests` executable (but uses `nose2` instead). D-oh! – Joost Oct 19 '15 at 06:52
45

Are you able to run myenv/bin/python /usr/bin/nosetests? That should run Nose using the virtual environment's library set.

John Millikin
  • 197,344
  • 39
  • 212
  • 226
12

In the same situation I needed to reload the virtualenv for the path to be correctly updated:

deactivate
env/bin/activate
Andrea Zonca
  • 8,378
  • 9
  • 42
  • 70
  • This is the one that did it for me. Any idea why you need to re-activate after installing nose (or nose2, in my case)? – hansmosh Mar 10 '16 at 20:10
  • @hansmosh, cannot test right now, it would be useful to check all the paths – Andrea Zonca Mar 14 '16 at 18:16
  • I had nose installed globally so the nosetests executable didn't resolve properly. the following worked: python `which nosetests` but this is the actual solution for me. – Steven Stip Mar 19 '19 at 16:48
9

I got a similar problem. The following workaround helped:

python `which nosetests` 

(instead of just nosestests)

npinto
  • 393
  • 3
  • 7
8

Here's what works for me:

$ virtualenv --no-site-packages env1
$ cd env1
$ source bin/activate            # makes "env1" environment active,
                                 # you will notice that the command prompt
                                 # now has the environment name in it.

(env1)$ easy_install nose        # install nose package into "env1"

I created a really basic package slither that had, in its setup.py, same test_suite attribute as you mentioned above. Then I placed the package source under env1/src.

If you looked inside env1/src, you'd see:

slither/setup.py
slither/slither/__init__.py
slither/slither/impl.py          # has some very silly code to be tested
slither/slither/tests.py         # has test-cases 

I can run the tests using test subcommand:

(env1)$ pushd src/slither
(env1)$ python setup.py test
# ... output elided ...
test_ctor (slither.tests.SnakeTests) ... ok
test_division_by_zero (slither.tests.SnakeTests) ... ok
Ran 2 tests in 0.009s
OK
(env1)$ popd

Or, I can run the same tests with nosetests:

(env1)$ pushd src
(env1)$ nosetests slither/
..
Ran 2 tests in 0.007s
OK
(env1)$ popd

Also note that nosetests can be picky about executables. You can pass --exe if you want it to discover tests in python modules that are executable.

Pavel Repin
  • 30,663
  • 1
  • 34
  • 41
1

If all else fails, try installing nose in your venv, and/or run nosetests-2.7. I believe @andrea-zonca's answer has the same effect if your venv python is 2.7

eggonlegs
  • 1,824
  • 2
  • 23
  • 34
0

You might have a nosetests that is installed somewhere else in your PATH with higher priority than the one installed in your virtualenv. A quick way to give the nose module and associated nosetests script installed in your current virtualenv top priority is to edit your PATH:

export PATH=/path/to/current/virtualenv/bin:$PATH
orluke
  • 2,041
  • 1
  • 17
  • 15
0

Late to the party.

Regardless, if you see this in the year 2021... These issues, for me, surrounding nose, nose-cov and pinocchio were resolved by updating my Virtual Envs to at least Python 3.8.2..

Jay Bose
  • 1,511
  • 2
  • 11
  • 14
0

Perhaps this is a recent change, but for me, when I installed nosetests through pip, there was a nosetests executable installed in .virtualenvs/<env>/bin, which (unsurprisingly) operates correctly with the virtualenv.

Josh Bleecher Snyder
  • 8,262
  • 3
  • 35
  • 37