激活Poetry虚拟环境且安装依赖后,VS Code调试仍报ModuleNotFoundError?
问题分析与解决
问题背景
使用VS Code+Poetry环境调试Python代码时,终端运行正常但按F5调试会抛出ModuleNotFoundError: No module named 'app',相关信息如下:
文件夹结构
├── poetry.lock ├── pyproject.toml ├── README.md └── src ├── app │ ├── api │ ├── core │ │ ├── config.py │ │ ├── __pycache__ │ │ └── worker.py │ ├── crud │ ├── __init__.py │ ├── lib │ │ ├── be.py │ │ ├── __init__.py │ │ ├── logger.py │ │ ├── omoi.py │ │ └── __pycache__ │ └── main.py
main.py代码
import argparse import lib.logger from core.config import settings from core.worker import Worker if __name__ == "main": parser = argparse.ArgumentParser(description='Basic Worker') parser.add_argument('--mode', type=str, choices=['test', 'dummy', 'prod'], default='prod') args = parser.parse_args() mode = args.mode main_worker = Worker() main_worker.start()
环境确认
已使用Poetry创建的解释器,终端状态栏显示:
service on main [✘!?] is 📦 v0.1.0 via 🐍 v3.10.6 (service-v4nvssyk-py3.10)
调试错误信息
ModuleNotFoundError No module named 'app' File "/home/me/service/src/app/lib/logger.py", line 4, in <module> from app.core.config import settings File "/home/me/service/src/app/main.py", line 2, in <module> import lib.logger
当前launch.json配置
{ "configurations": [ { "name": "Python: current file", "type": "python", "request": "launch", "program": "${file}", "console": "integratedTerminal", "justMyCode": true, "env": { "PYTHONPATH": "${workspaceRoot}"} } ] }
问题原因
- PYTHONPATH配置错误:调试时设置的
PYTHONPATH为工作根目录(service),但app模块实际位于service/src下,Python无法从工作根目录定位到app模块。终端运行时是在service/src/app目录执行python main.py,当前目录会被自动加入Python路径,且Poetry环境可能自动处理了路径映射,而调试时未正确配置路径。 - 导入方式冲突:
main.py使用相对路径导入(import lib.logger、from core.config import settings),但logger.py使用绝对路径导入(from app.core.config import settings),当src目录不在Python路径中时,绝对导入会失败。 - 入口判断拼写错误:
main.py中的if __name__ == "main"是错误写法,正确应为if __name__ == "__main__",虽不直接导致导入错误,但会使入口逻辑无法触发。
解决方法
方法1:修正launch.json的PYTHONPATH
将PYTHONPATH改为${workspaceRoot}/src,让Python能找到app模块:
{ "configurations": [ { "name": "Python: current file", "type": "python", "request": "launch", "program": "${file}", "console": "integratedTerminal", "justMyCode": true, "env": { "PYTHONPATH": "${workspaceRoot}/src"} } ] }
方法2:统一导入方式
若偏好相对导入,修改logger.py中的导入语句为相对路径:
# logger.py from ..core.config import settings
方法3:修正入口判断语句
同步修正main.py的入口判断,确保代码逻辑能正常执行:
if __name__ == "__main__": # 原有业务逻辑
内容的提问来源于stack exchange,提问作者gdm
相关产品推荐
相关产品推荐

