运行Flask时出现ModuleNotFoundError,求助解决模块导入问题
解决Flask运行时ModuleNotFoundError问题
问题场景
项目结构:
── myproject ├── mypackage │ ├── __init__.py │ ├── utils.py ├── main.py ├── app.py (Flask应用)
main.py中的导入语句:from myproject.mypackage.utils import func- 单独运行
main.py正常,但运行app.py时抛出ModuleNotFoundError: No module named myproject
原因分析
直接运行app.py时,Python会将app.py所在的myproject目录加入模块搜索路径sys.path。此时myproject本身是当前工作目录的一部分,Python无法在搜索路径中找到名为myproject的上级模块,因此报错。而单独运行main.py时,你大概率是在myproject的父目录下执行(比如python myproject/main.py或python -m myproject.main),此时父目录被加入sys.path,所以能正确解析myproject.mypackage的导入。
解决方案
方案1:修改main.py的导入语句(推荐)
因为main.py和mypackage同属myproject目录,直接使用相对当前目录的导入即可:
# main.py中替换原导入语句 from mypackage.utils import func
这种方式符合项目目录结构逻辑,无需额外修改路径,适用性更强。
方案2:在app.py中添加模块搜索路径
如果不想修改main.py的导入逻辑,可以在app.py开头将myproject的父目录加入sys.path:
from flask import Flask, request import sys import os # 将myproject的父目录添加到Python模块搜索路径 sys.path.append(os.path.dirname(os.path.abspath(__file__))) import main @app.route('/') def run_job(): return main.do_something() if __name__ == '__main__': app.run(debug = True)
注:os.path.abspath(__file__)获取app.py的绝对路径,os.path.dirname()取其所在目录(即myproject),将这个目录加入sys.path后,Python就能识别myproject作为模块。
方案3:使用Python模块方式运行app.py
在myproject的父目录下,通过-m参数以模块方式启动Flask应用:
python -m myproject.app
这种方式会自动将父目录加入sys.path,符合Python模块导入规范,无需修改代码。
内容的提问来源于stack exchange,提问作者user3376169
相关产品推荐
相关产品推荐

