VSCode中coverage run报错:ModuleNotFoundError: No module named 'b'
解决终端执行coverage时的ModuleNotFoundError问题
问题原因
VSCode测试面板会自动读取settings.json中指定的.env文件加载PYTHONPATH,但终端默认不会自动加载该文件的环境变量,导致执行coverage命令时,Python无法找到src目录下的模块。
解决方法
方法1:终端手动加载.env后执行命令
根据你的操作系统,在终端先加载.env的环境变量,再执行coverage命令:
- Linux/macOS(bash/zsh):
source .env && coverage run --source=./tests,./src,./src/model_manager -m unittest - Windows CMD:
for /f "tokens=*" %i in (.env) do set %i coverage run --source=./tests,./src,./src/model_manager -m unittest - Windows PowerShell:
Get-Content .env | ForEach-Object { if ($_ -match '^([^#]+?)=(.*)') { Set-Item -Path Env:$($matches[1]) -Value $matches[2] } } coverage run --source=./tests,./src,./src/model_manager -m unittest
方法2:改用相对导入(推荐)
修改src/a.py中的导入语句,从绝对导入改为相对导入,不依赖PYTHONPATH:
将import b改为:
from . import b
这样Python会基于src包的结构查找模块,无论终端还是测试面板都能正常运行测试。注意如果直接运行a.py脚本,需要用python -m src.a而非python src/a.py,但unittest测试不受影响。
方法3:配置VSCode终端自动加载.env
修改.vscode/settings.json,让终端启动时自动加载.env文件,以后每次打开终端都无需手动加载:
- Linux/macOS:
"terminal.integrated.profiles.linux": { "bash": { "args": ["-c", "source ${workspaceFolder}/.env && exec bash"] } }, "terminal.integrated.defaultProfile.linux": "bash" - Windows PowerShell:
"terminal.integrated.profiles.windows": { "PowerShell": { "args": ["-NoExit", "-Command", "Get-Content ${workspaceFolder}/.env | ForEach-Object { if ($_ -match '^([^#]+?)=(.*)') { Set-Item -Path Env:$($matches[1]) -Value $matches[2] } }"] } }, "terminal.integrated.defaultProfile.windows": "PowerShell"
内容的提问来源于stack exchange,提问作者Code Pope
相关产品推荐
相关产品推荐

