将Flask机器学习应用部署至Streamlit时遇ModuleNotFoundError求助
解决Streamlit部署时的ModuleNotFoundError及后续问题
核心原因
这个错误是因为Python导入路径与运行环境不匹配:Heroku上Flask的运行上下文默认把项目根目录作为模块搜索路径,而Streamlit运行时的工作目录或路径配置不同,导致找不到app模块。
分步解决方案
1. 修正导入语句
由于run.py和classDefs.py处于同一app目录下,直接移除导入语句中的app.前缀即可:
from classDefs import ItemSelector, tokenize, StartingVerbExtractor, MessageLengthExtractor
2. 强制添加项目根目录到Python路径
如果修正导入后仍有模块找不到的问题,在run.py的最开头添加以下代码,确保Python能识别项目根目录下的模块:
import sys import os # 将项目根目录(app目录的上级目录)加入搜索路径 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
3. 规范Streamlit运行命令
必须从项目根目录执行Streamlit启动命令,避免路径混乱:
streamlit run app/run.py
不要进入app目录后再运行streamlit run run.py,否则Python会把app目录当作当前工作目录,无法正确识别上级目录的模块。
4. 排查依赖与环境一致性
移除前缀后的其他错误,大多是依赖缺失或环境不一致导致:
- 确保
requirements.txt包含所有必要依赖(和Heroku上的配置一致,比如scikit-learn、nltk、streamlit等) - 运行前执行
pip install -r requirements.txt,保证所有库版本匹配
内容的提问来源于stack exchange,提问作者Mohamed Hedeya
相关产品推荐
相关产品推荐

