Python模块导入报ModuleNotFoundError: No module named 'app'求解
问题根因
ModuleNotFoundError: No module named 'app'报错由两个问题直接导致:
- 导入语句的顶层包名写错。从你给出的验证线索:
database/versions目录下的文件执行from api.setup import *可正常导入,说明你项目的顶层业务包实际名为api,不存在名为app的顶层包,services/user.py里写的from app.setup import *自然找不到对应模块。 - Python模块搜索路径未正确覆盖项目根目录。Python导入模块时只会搜索当前运行脚本所在目录、
PYTHONPATH环境变量配置路径、标准库与第三方库路径,如果你直接在services子目录内运行user.py,解释器无法定位到上层的项目根目录,哪怕包名写对也可能出现导入失败。

修复方案
按优先级操作即可解决问题:
- 第一步:修正包名导入错误
把services/user.py内的导入语句替换为匹配实际包名的写法:# services/user.py file from api.setup import * from api.models.user import User - 第二步:规范脚本运行方式
不要进入services、models这类子目录直接运行.py文件,始终在包含api、services、database文件夹的项目最外层根目录下,以模块模式运行脚本,例如执行user.py时用命令:
这种运行方式会自动将项目根目录加入Python模块搜索路径,不会出现子目录运行时的路径错乱问题。python -m services.user - 第三步(可选,一劳永逸):以可编辑模式安装当前项目
在项目根目录新建最小配置的pyproject.toml文件:
在项目根目录执行命令:[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "backend-demo" version = "0.0.1" packages = ["api", "services", "models"]
安装完成后,无论你在哪个工作目录运行项目脚本,都可以正常导入项目内的所有模块,不需要反复调整路径。pip install -e .
额外代码问题提示
你当前services/user.py里的查询逻辑有bug:session.scalars()返回的是可迭代的结果集对象,不是单个用户实例,直接访问user.first_name会抛属性错误,需要取单条结果时要在查询后加.first()方法:
def get_user(user_id): user = session.scalars(select(User).where(User.id == user_id)).first() # 后续打印逻辑不变
另外不建议在项目中大量使用from xxx import *的导入方式,项目规模变大后很容易出现变量命名冲突、依赖溯源困难的问题,建议明确导入需要使用的对象,例如from api.setup import session, select。
内容的提问来源于stack exchange,提问作者Just Me
相关产品推荐
相关产品推荐

