Python API开发遇ModuleNotFoundError:无法导入app模块求助
解决Python测试脚本中"ModuleNotFoundError: No module named 'app'"的问题
问题根源
你遇到的问题本质是Python模块搜索路径不包含项目根目录,导致脚本无法识别app作为顶层模块。另外,项目中不同目录的导入规则不统一,也加重了路径混乱。
先确认你的项目结构
首先确保目录层级是这样的(根目录假设为api_project):
api_project/ ├── app/ │ ├── __init__.py │ ├── database.py │ ├── models/ │ │ ├── __init__.py │ │ ├── Ad.py │ │ └── SubCategory.py │ ├── services/ │ │ ├── __init__.py │ │ └── AdService.py │ └── tests/ │ ├── __init__.py │ └── AdServiceTest.py
具体修复步骤
1. 统一项目内的导入方式
修改services/AdService.py的导入
因为services是app的子目录,必须用从顶层app开始的绝对导入,避免相对导入的歧义:
from app.models.Ad import Ad from app.models.SubCategory import SubCategory from app.database import session class AdService: # ... 你的业务代码
保留tests/AdServiceTest.py的绝对导入
当前测试文件里的from app.models.Ad import Ad路径是对的,只要Python能找到app模块就可以正常运行。
2. 让Python找到app模块的两种可行方法
方法一:在项目根目录运行测试
打开终端,切换到api_project/(项目根目录),然后执行以下命令之一:
# 方式1:用unittest模块运行 python -m unittest app.tests.AdServiceTest # 方式2:直接运行测试文件 python app/tests/AdServiceTest.py
这种方法最规范,不需要修改代码,推荐使用。
方法二:手动把根目录加入搜索路径
如果习惯直接在tests目录下运行脚本,就在AdServiceTest.py的最顶部添加以下代码,强制把项目根目录加入Python的模块搜索路径:
import sys import os # 从当前测试文件的位置,往上两级找到项目根目录 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))) # 之后再写原有的导入代码 import unittest from datetime import datetime from app.models.Ad import Ad from app.services.AdService import AdService # ... 其余代码
3. 避坑提醒
- 不要直接在
tests目录下执行python AdServiceTest.py,此时Python的工作目录是tests/,上层的app不在搜索路径里,必然报错。 - 不要混用相对导入(比如
..models.Ad)和绝对导入,跨目录调用时绝对导入更稳定。
内容的提问来源于stack exchange,提问作者itzick binder
相关产品推荐
相关产品推荐

