Py.test No module named *
Solution 1:
Working with Python 3 and getting the same error on a similar project layout, I solved it by adding an __init__
file to my tests
module.
$ touch tests/__init__.py
I'm not great at packaging and importing, but I think that this helps pytest
work out where the target App
module is located.
Solution 2:
I already had an __init__.py
file in the /App/App
directory and wanted to run tests from the project root without any path-mangling magic:
python -m pytest tests
The output immediately looks like this:
➟ python -m pytest tests
====================================== test session starts ======================================
platform linux -- Python 3.5.1, pytest-2.9.0, py-1.4.31, pluggy-0.3.1
rootdir: /home/andrew/code/app, inifile:
plugins: teamcity-messages-1.17
collected 46 items
... lines omitted ...
============================= 44 passed, 2 skipped in 1.61 seconds ==============================
Solution 3:
So you are running py.test
from /App
. Are you sure /App/App
is in your $PYTHONPATH
?
If it's not, code that tries to import app
will fail with such a message.
EDIT0: including the info from my comment below, for completeness.
An attempt to import app will only succeed if it was executed inside /App/App
, which is not the case here. You probably want to make /App/App
a package by putting __init__.py
inside it, and change your import to qualify app as from App import app
.
EDIT1: by request, adding further explanation from my second comment below.
By putting __init__.py
inside /App/App
, that directory becomes a package. Which means you can import from it, as long as it - the directory - is visible in the $PYTHONPATH
. I.e. you can do from App import app
if /App
is in the $PYTHONPATH
. Your current working directory gets automatically added to $PYTHONPATH
, so when you run a script from /App
, the import will work.
Solution 4:
I had a similar problem and had to delete __init__.py
from the root and add an __init__.py
to the tests
folder.
Solution 5:
Running pytest
with the python -m pytest
command helps with this exact thing.
Since your current package is not yet in your $PYTHONPATH
or sys.path
- pytest gets this error.
By using python -m pytest
you automatically add the working directory into sys.path
for running pytest
. Their documentation also mentions:
This is almost equivalent to invoking the command line script
pytest