pylint false positive E0401 import errors in vscode while using venv

Solution 1:

Pylint has some quirks. In this case it doesn't know where to find your module because it's in subdirectory of your venv path. To solve this:

  1. Put this setting in your workspace or folder settings:

    "python.linting.pylintArgs": [
        "--init-hook",
        "import sys; sys.path.append('<path to folder your module is in>')"
    ]
    

    or, maybe better

  2. Generate .pylintrc file. From integrated terminal with venv activated run:

    pylint --generate-rcfile > .pylintrc 
    

    then open the generated file and uncomment the init-hook= part to be:

    init-hook='import sys; sys.path.append("<path to folder you module is in>")'
    

    Read the .pylintrc and tweak settings if you wish. In both cases path should point to your 'database' folder.

  3. After learning about pylint settings, do it the right way:

    from database.database_dispatcher import ...
    

    See this answer by Anthony Sottile.

Solution 2:

To me, pylint is correct in flagging this error here

the top level module is database (it contains an __init__.py file)

Your import should look like (fully absolute)

from database.database_dispatcher import ...

or (explicit relative) (yes! the . before the module name is intentional)

from .database_dispatcher import ...

My follow-up guess is that you're currently invoking your script as python ./database/main.py ... which is putting ./database at the beginning of sys.path so it would appear that your imports are working correctly -- this is side-stepping your module structure however. You should be invoking your script using python -m database.main ... instead.

Note that implicit relative imports were removed in python 3.x -- though this (imo) wart of script sys.path insertion remains.

Solution 3:

Just my $0.02 on how I fixed it in my situation.

My problem was totally related to having pylint installed globally, and coding in a venv. vscode was trying to use the globally installed pylint which simply was not aware of dependencies I installed in my Python venv. This answer solved my problem. It points here which explained how to configure vscode to run using the venv for my project. Once i did that vscode immediately threw a warning saying I had no linting tool installed and prompted me to install one. Once that was done my linting false-positives went away.