Heroku部署应用触发nltk.downloader运行时警告 应用无法访问如何解决
解决方案
该警告由NLTK模块导入与下载器执行的时序冲突导致,在Heroku无交互部署环境下通常还会伴随NLTK资源下载失败,最终导致应用无法正常启动,可按以下方案修复:
- 方案1:预下载NLTK资源随项目部署(最稳妥)
- 本地项目根目录新建
nltk_data文件夹 - 本地执行下载命令将需要的资源存到该目录:
import nltk nltk.download(['wordnet', 'punkt', 'stopwords', 'vader_lexicon'], download_dir='./nltk_data')- 在应用启动入口的最顶部添加路径指定代码:
import nltk import os nltk.data.path.append(os.path.join(os.getcwd(), 'nltk_data'))- 将
nltk_data文件夹提交到代码仓库后重新部署即可,不需要在Heroku构建、启动阶段执行下载操作,可完全规避时序警告,同时解决资源下载超时问题。
- 本地项目根目录新建
- 方案2:调整启动阶段的下载逻辑
若不想把资源提交到代码仓库,修改原有下载代码,不要在模块顶层直接调用nltk.download,将下载逻辑放到应用初始化的最前端,保证导入和调用逻辑连续:
也可以直接修改Heroku的import nltk for pkg in ['wordnet', 'punkt', 'stopwords', 'vader_lexicon']: nltk.download(pkg)Procfile启动命令,先执行下载再启动应用,示例:web: python -c "import nltk; nltk.download(['wordnet','punkt','stopwords','vader_lexicon'])" && gunicorn your_app:app - 方案3:使用预打包的NLTK资源包
直接安装PyPI上已经打包好对应资源的第三方分发包,安装后即可直接调用,不需要自行执行下载逻辑,从根源避免时序冲突问题。
内容的提问来源于stack exchange,提问作者moulesh manikandan
相关产品推荐
相关产品推荐

