This is what my project looks like (oversimplified):
root/ ├── test/ | └── test_code.py └── code.py
Whenever I run pytest standing in root/ I get ImportError : Attempted relative import with no known parent package.
If I move test_code.py
out to root/ everything works fine. But this is not an option since I have many modules and that is why I need to put ALL test modules inside a test-folder for organizing.
I am using VSCode and the weird thing is: VSCode finds my imported functions inside test_code.py.
from ..code import func
– if I right-click on func
VSCode jumps up to code.py
outside of test-folder.
When I try to run test_code.py
directly in VSCode I get ValueError: attempted relative import beyond top-level package.
How can VSCode find my imported functions but cannot run them and pytest cannot run them either?
- I have tried adding
__init__.py
to make root/ a package. - I have tried adding
.env
as stated here.
Solution
- I moved
code.py
into src/ and added__init__.py
files in each folder to let Python know that test/ and src/ are packages:
root/ ├── test/ | ├── __init__.py | └── test_code.py └── src/ ├── __init__.py └── code.py
- I had to use absolute imports in all files:
from folder.file import function
. Read about absolute vs. relative imports here. If you open your code in root – VSCode will now find your imports!
This is what test_code.py looks like:
from src.code import func
Finally, running pytest works! If you want to run code.py
from terminal you have to run:
$ python3 -m src.code
Advertisement
Answer
Solution
- I moved
code.py
into src/ and added__init__.py
files in each folder to let Python know that test/ and src/ are packages:
root/ ├── test/ | ├── __init__.py | └── test_code.py └── src/ ├── __init__.py └── code.py
- I had to use absolute imports in all files:
from folder.file import function
. Read about absolute vs. relative imports here. If you open your code in root – VSCode will now find your imports!
This is what test_code.py looks like:
from src.code import func
Finally, running pytest works! If you want to run code.py
from terminal you have to run:
$ python3 -m src.code