Flask项目Heroku运行正常本地报ModuleNotFoundError导入错误
问题根源
- 直接运行
app.py时报错是因为入口文件名和顶层包目录同名,Python运行时会优先把入口脚本app.py识别为app模块,而非你作为包的app目录,因此无法找到app.resources等子模块。 - 将
app.py重命名为test.py后报错是因为你直接在app目录下执行脚本,Python默认仅会将当前执行脚本所在的目录(即app目录)加入模块搜索路径,无法搜索到上层的app包。
解决方案
方案1:调整目录结构(最推荐,适配部署和本地开发逻辑)
将入口文件移到app目录的外层,调整后目录结构如下,同时确保所有作为包的目录下都有__init__.py文件:
项目根目录/ run.py # 原app.py的全部内容迁移到此处 app/ __init__.py config.py db.py models/ __init__.py authentication.py resources/ __init__.py authentication.py routes/ __init__.py authentication.py
调整后在项目根目录下执行python run.py即可正常启动,原有代码中from app.xxx import xxx的导入逻辑不需要做任何修改,和Heroku部署的运行逻辑完全一致。
方案2:不调整结构,修改启动命令
如果不需要调整现有目录结构,可以切换到app目录的上层目录,用模块执行的方式启动项目:
# 执行命令时所处目录为app目录的父目录 python -m app.app
该方式会自动将当前所在目录加入Python模块搜索路径,同时将app目录识别为Python包,app.app对应包内的app.py入口文件。
方案3:临时修改模块搜索路径(仅适用临时调试场景)
如果一定要在app目录下直接运行app.py,可以在app.py的所有导入语句之前添加以下代码,手动将上层目录加入模块搜索路径:
import sys from pathlib import Path sys.path.append(str(Path(__file__).parent.parent.resolve()))
内容的提问来源于stack exchange,提问作者Tron
相关产品推荐
相关产品推荐

