Ubuntu EC2部署Flask+Gunicorn遇ModuleNotFoundError求助
问题原因分析
- 模块查找路径缺失:Gunicorn运行时的Python解释器
sys.path未包含项目根目录/home/ubuntu/objDetection,导致Python无法定位同目录下的object_detection.py模块。 - 导入方式不符合Python规范:在
__init__.py中直接使用import object_detection属于绝对导入,Python会将其视为顶级模块,从sys.path的全局路径中查找,而非当前项目目录。 - 虚拟环境与运行上下文的冲突:Gunicorn安装在项目内的
venv虚拟环境中,运行时会使用虚拟环境的Python解释器,其sys.path仅包含虚拟环境的依赖路径,未自动加入项目根目录。
解决方案
方案1:修改相对导入语句(推荐)
将__init__.py中的导入代码改为相对导入,明确从当前包目录查找模块:
from . import object_detection
方案2:通过环境变量指定Python路径
运行Gunicorn时,通过PYTHONPATH环境变量将项目根目录加入模块查找路径:
PYTHONPATH=/home/ubuntu/objDetection gunicorn -w 3 objDetection:app
方案3:使用WSGI入口文件
在项目根目录创建wsgi.py文件,手动添加项目路径到sys.path:
import sys import os # 将项目根目录插入到Python路径的最前面 sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) # 导入Flask应用 from objDetection import app as application
然后运行Gunicorn时指定该入口文件:
gunicorn -w 3 wsgi:application
原理讲解
- Python模块查找机制:Python通过
sys.path列表中的路径依次查找模块,默认包含当前工作目录、标准库路径和虚拟环境的site-packages。若项目根目录不在sys.path中,同目录下的模块无法被识别为可导入模块。 - 相对导入 vs 绝对导入:Python 3中,相对导入(如
from . import xxx)用于引用当前包内的模块,而绝对导入(如import xxx)用于引用sys.path中的顶级模块。在包内部使用相对导入能避免路径依赖问题。 - 虚拟环境的运行上下文:虚拟环境的Python解释器拥有独立的
sys.path,仅加载虚拟环境内安装的依赖。运行Gunicorn时,需手动将项目根目录加入路径,才能让虚拟环境的Python找到项目本地模块。
内容的提问来源于stack exchange,提问作者Guilherme Simao
相关产品推荐
相关产品推荐

