I have a project structured like this:
.
└── myapp
├── app.py
├── models
│ ├── hello.py
│ └── world.py
└── requirements.txt
I have two models, hello and world. Both models are used from app.py where I import them like this:
from models.hello import Hello
from models.world import World
But world also needs to use hello. I tried this in world.py:
from models.hello import Hello
The above technically works when I run the app, but VSCode's Python extension gives me the following error:
E0401:Unable to import 'models.hello'.
What is the proper way of importing a submodule from the same directory? How do I avoid this error in VSCode?
The error you are receiving is one that's reported by a python linter named pylint. So the problem isn't really specific to the vscode extension.
There are two solutions:
Please try adding an .env file in your project directory with the vape PYTHONPATH=./myapp, this will tell pylint where to find your modules
Or just open the folder myapp in vscode directly instead of opening the parent directory in vscode.
The error is coming from pylint. You need to add this line into settings.json file (VS Code):
"python.linting.pylintArgs": ["--init-hook",
"import sys; sys.path.append('<absolute path to myapp directory>')"],
Since hello.py and world.py are in the same folder (aka package), you should import the Hello class in world.py as follow:
from .hello import Hello
As described in this thread: What does a . in an import statement in Python mean?
The . is here to indicate the import from the current package.