pytest cannot import module while python can
I can't say I understand why this works, but I had the same problem and the tests work fine if I run
python -m pytest.
I'm in a virtualenv, with pytest also available globally:
(proj)tom@neon ~/dev/proj$ type -a python python is /home/tom/.virtualenvs/proj/bin/python python is /usr/bin/python (proj)tom@neon ~/dev/proj$ python -V Python 3.5.2 (proj)tom@neon ~/dev/proj$ type -a pytest pytest is /home/tom/.virtualenvs/proj/bin/pytest pytest is /usr/bin/pytest (proj)tom@neon ~/dev/proj$ pytest --version This is pytest version 3.5.0, imported from /home/tom/.virtualenvs/proj/lib/python3.5/site-packages/pytest.py
I am working on a package in Python. I use virtualenv. I set the path to the root of the module in a .pth path in my virtualenv, so that I can import modules of the package while developing the code and do testing (Question 1: is it a good way to do?). This works fine (here is an example, this is the behavior I want):
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ python Python 2.7.12 (default, Jul 1 2016, 15:12:24) [GCC 5.4.0 20160609] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from rc import ns >>> exit() (VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ python tests/test_ns.py issued command: echo hello command output: hello
However, if I try to use PyTest, I get some import error messages:
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ pytest =========================================== test session starts ============================================ platform linux2 -- Python 2.7.12, pytest-3.0.5, py-1.4.31, pluggy-0.4.0 rootdir: /home/zz/Desktop/GitFolders/rc, inifile: collected 0 items / 1 errors ================================================== ERRORS ================================================== ________________________________ ERROR collecting tests/test_ns.py ________________________________ ImportError while importing test module '/home/zz/Desktop/GitFolders/rc/tests/test_ns.py'. Hint: make sure your test modules/packages have valid Python names. Traceback: tests/test_ns.py:2: in <module> from rc import ns E ImportError: cannot import name ns !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ========================================= 1 error in 0.09 seconds ========================================== (VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ which pytest /home/zz/Desktop/VirtualEnvs/VEnvTestRc/bin/pytest
I am a bit puzzled, it looks like this indicates an import error, but Python does it fine so why is there a problem specifically with PyTest? Any suggestion to the reason / remedy (Question 2)? I googled and stack-overflowed the 'ImportError: cannot import' error for PyTest, but the hits I got were related to missing python path and remedy to this, which does not seem to be the problem here. Any suggestions?
I just solved this by removing the __init__.py in my project root:
. ├── __init__.py <--- removed ├── models │ ├── __init__.py │ ├── address.py │ ├── appointment.py │ └── client.py ├── requirements.txt ├── setup.cfg ├── tests │ ├── __init__.py │ ├── models │ │ ├── __init__.py │ │ ├── appointment_test.py │ │ └── client_test.py │ └── other_test.py └── script.py
In my case, the import error occurred because the package is pointing to another package/directory with the same name and its path is one level above the folder I actually wanted. I think this also explains why some people need to remove _ init _.py while others need to add back.
I just put
import the_root_package) in both
python console and
pytest scripts to compare the difference
BOTTOM LINE: When you do
python, the package you import may be different from the package when you run
I had a similar issue, exact same error, but different cause. I was running the test code just fine, but against an old version of the module. In the previous version of my code one class existed, while the other did not. After updating my code, I should have run the following to install it.
sudo pip install ./ --upgrade
Upon installing the updated module running pytest produced the correct results (because i was using the correct code base).