在使用VS Code调试器时,尽管已经激活了虚拟环境,仍然出现 "ModuleNotFoundError: No module named 'streamlit'"
我在VS Code中开发一个Streamlit应用。为这个项目我创建了一个虚拟环境(venv),在终端中激活它,并安装了所有依赖项(包括streamlit)。
当我在终端里使用 streamlit run app.py 运行应用时,一切都正常。然而,当我试图在VS Code调试器中调试时,它会立即失败,错误信息是:ModuleNotFoundError: No module named 'streamlit'
我遇到的问题和这个 问题 中描述的差不多,但那里给出的解决办法只是说“我的解释器没有正确指向虚拟环境中的Python”,这不是我的情况。
我尝试过的办法:
- 在VS Code的状态栏中选择正确的解释器(例如,如此处 所推荐的)。
- 添加一个
launch.json,其中包含"type": "python"和"request": "launch"。就像在这篇 帖子 中所示,但对该文件还有很多其他变体,且都没有起作用。 - 确认
pip list显示已安装Streamlit。 - 确保我处在 环境 中。
为什么调试器看不到在终端里显然可用的模块?
解决方案
经过大量时间的摸索,我发现问题源于shell环境与VS Code调试引擎之间的“静默断开”。尽管解释器设置正确,调试器往往尝试把脚本当作普通的Python文件(python app.py)来运行,而不是通过Streamlit CLI,或者即使路径中有json文件,它也未能继承venv的 PATH。
使用 python -m pip 以避免“幽灵”安装
首先要明确我想使用的Python,并使用
python -m pip install
而不是使用默认的 pip install,因为有时默认会回退到全局或缓存的pip,即使在“激活”的虚拟环境中也是如此。使用 pip install 可能会导致(在我看来确实如此)一个碎片化的环境:终端能看到包,但特定的venv Python可执行文件却看不到。
始终使用虚拟环境中具体的Python二进制来安装依赖:
# Ensure you are targeting the exact venv binary
./venv/bin/python -m pip install -r requirements.txt
使用“Module”启动配置
按照另一篇文章的建议,创建一个明确调用 streamlit 模块的 .vscode/launch.json 并定义要使用的命令和Python也是必不可少的。使用 ${workspaceFolder} 变量,确保在绝对路径不同的情况下也能工作。
JSON
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Streamlit Debug",
"type": "python",
"request": "launch",
"module": "streamlit",
"python": "${workspaceFolder}/venv/bin/python", // Points directly to venv
"args": [
"run",
"${workspaceFolder}/app.py",
"--server.port", "8501"
],
"console": "integratedTerminal",
"justMyCode": true
}
]
}
注:在Windows上,请使用 "${workspaceFolder}/venv/Scripts/python.exe"。
---
如果错误仍然存在,请在终端中运行以下命令,以确认模块实际位于何处:
Bash
./venv/bin/python -m streamlit --version
如果这返回 No module named streamlit,说明venv的内部 site-packages 文件夹中缺少该软件包,必须使用上面的命令重新安装。