skip to Main Content

I have a python project in Ubuntu 24.04.1 LTS and I have a DevContainer in VSC with Debian GNU/Linux 11, the problem is that Pylance is flagging import streamlit as st with Import "streamlit" could not be resolved. If I run the application from the terminal with streamlit run myfile.py, it runs perfectly, but launching the debugger raises this exception:

EDIT I reset the Docker image, and the exception changed to a simpler one:

/usr/bin/python3: No module named streamlit

This is my devcontainer.json:

{
    "build": {"dockerfile": "Dockerfile"},
    "customizations": {
        "vscode": {
            "settings": {},
            "extensions": [
                "ms-python.python",
                "ms-python.vscode-pylance"
            ]
        },
        "forwardPorts": [8501],
        "runArgs": ["--env-file",".devcontainer/devcontainer.env"]
    }
}

This is my Dockerfile:

FROM python:3.10-bullseye

COPY requirements.txt ./requirements.txt

RUN pip install oscrypto@git+https://github.com/wbond/oscrypto.git@d5f3437ed24257895ae1edd9e503cfb352e635a8

# COPY src ./src
# WORKDIR /src
RUN pip install --no-cache-dir -r requirements.txt

ENV PYTHONPATH=/workspaces/my_project/src

EXPOSE 8001
CMD ["streamlit", "run", "view/frontend/main.py"]

And this is my launch.json:

{
    "version": "0.2.0",
    "configurations": [        
        {
            "name": "Python: Current File",
            "type": "debugpy",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "justMyCode": true,
            "env": {"PYTHONPATH": "${workspaceFolder}/src"}
        },
        {
            "name": "Python:Streamlit",
            "type": "debugpy",
            "request": "launch",
            "module": "streamlit",
            "args": [
                "run",
                "${file}",
                "--server.port",
                "8501",
                "--server.fileWatcherType",
                "poll",
                "--server.address",
                "0.0.0.0"
            ],
            "cwd": "${workspaceFolder}/src",
            "env": {
                "PYTHONPATH": "${workspaceFolder}/src",
                "PYTHONHOME": "/usr/local/bin"
            }
        }
    ]
}

I have tried a lot of configurations, but I failed to find one that works.

EDIT
I have pylance and streamlit workinng together in another computer with a VSC Dev Container over Windows, and they work perfectly.

This is what I get with python -m site:

sys.path = [
    '/workspaces/sacbeh',
    '/workspaces/sacbeh/src',
    '/usr/local/lib/python310.zip',
    '/usr/local/lib/python3.10',
    '/usr/local/lib/python3.10/lib-dynload',
    '/usr/local/lib/python3.10/site-packages',
]
USER_BASE: '/root/.local' (doesn't exist)
USER_SITE: '/root/.local/lib/python3.10/site-packages' (doesn't exist)
ENABLE_USER_SITE: True

2

Answers


  1. Yeah, it’s unclear what’s going on there.
    I can easily reproduce such behavior with python 3.13.0 under macOS.

    $ cat st.py && python st.py && echo && pyright st.py
    import streamlit
    print('Hello, world!')
    
    Hello, world!
    
    st.py:1:8 - error: Import "streamlit" could not be resolved (reportMissingImports)
    1 error, 0 warnings, 0 informations 
    

    solution

    I recommend you move on to
    another linter
    when working with streamlit:

    $ mypy st.py 
    Success: no issues found in 1 source file
    

    It also accepts switches like --ignore-missing-imports if you
    continue to run into trouble.
    I usually find it most helpful when executed using --strict.


    But, does this solve the debugging error, or just the linting

    There’s two questions posed.
    I answered the first one, by suggesting the use of a non-broken linter.

    In a subsequent edit you explained

    I reset the Docker image, and the exception changed to a simpler one:

    /usr/bin/python3: No module named streamlit

    Well, that seems pretty straightforward to fix.
    I don’t know what the verb "reset" means here,
    but the symptom shows that "broke" is an appropriate verb.
    Your sys.path is not pointing at a venv with streamlit installed.
    (Or, IDK maybe you’re shooting for system level library installs,
    and streamlit isn’t installed.
    Yeah, RUN pip install ... -r requirements.txt
    looks like it uses a system-wide folder such as /usr/local.
    It’s not obvious to me how the interpreter in /usr/bin
    is going to find /usr/local folders.
    I usually rely on python -m venv and then source activate,
    but you have gone down a different config path in your container.)

    It’s easy enough to fix up "missing deps".
    Start with $ which python to verify that the interpreter
    you think is running truely is the one that does run.
    Then $ python -m site offers a convenient way to
    see which directories import consults.
    Adjust the PYTHONPATH env var if your favorite folder is missing.

    Sometimes $ which pip shows it is coming from a different place.
    Installing deps with $ python -m pip install streamlit foo bar baz
    is more robust, as the install is guaranteed to use the same interpreter
    and same venv as the execution environment.

    Running

    $ find /workspaces/sacbeh /usr/local/lib/python3.10/site-packages |
        grep streamlit
    

    should reveal where pip installed the library.
    If it is absent, then streamlit imports won’t succeed.
    (BTW, USER_BASE and USER_SITE not existing is definitely
    not a problem, don’t worry about that.)


    If code runs fine from ENTRYPOINT or a bash prompt,
    but not from an IDE, one can always use the stopgap
    of inserting a breakpoint() call in the code,
    until the IDE can be coaxed into working again.
    An if statement can even conditionally enter
    the standard debugger.

    Login or Signup to reply.
  2. It seems the issue occurs because VSCode, Pylance, and the debugger are not using the Python interpreter inside your Docker container where streamlit is installed. When you run streamlit from the terminal, it works because it uses the correct environment within the container. To fix this, ensure that VSCode is configured to use the Python interpreter inside your container (e.g., /usr/local/bin/python3.10). Update your launch.json file to specify this interpreter explicitly in your debug configurations, and make sure Pylance is set to use the same interpreter by adjusting your settings.json if necessary. Avoid setting PYTHONHOME, as it can cause conflicts. By aligning VSCode, Pylance, and the debugger to use the correct interpreter inside your Docker container, they should be able to resolve the streamlit module, and the debugger should run without any exceptions.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search