在macOS 10.13.4上运行Django调用KoNLPy时JRE 10.0+46崩溃求助
Django中运行KoNLPy(Twitter分词器)时JRE崩溃的解决方案
看起来你在Django项目里用KoNLPy.tags.Twitter的时候碰到了JRE致命崩溃的问题,错误里提到的SIGSEGV和_jpype.cpython-35m-darwin.so帧,大概率是Java版本、JPype兼容性或者Django线程初始化的问题。我整理了几个经过验证的解决办法,你可以试试:
1. 降级Java到8版本
KoNLPy依赖的JPype对Java 9及以上版本的兼容性一直不太好,尤其是macOS环境下。你现在用的是Java 10,建议直接卸载它,换成Java SE 8。安装完成后,记得把环境变量JAVA_HOME指向Java 8的路径:
- 临时切换可以在终端执行:
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8) - 永久生效的话,把上面的命令加到
~/.bash_profile或者~/.zshrc里(根据你用的shell来选)。
2. 匹配JPype和Python的版本
你的Python是3.5,不要用最新版的JPype1,建议安装0.7.x的稳定版本,比如0.7.5。执行下面的命令重装:
pip uninstall jpype1 pip install jpype1==0.7.5
3. 全局初始化分词器,避免线程冲突
如果你在每个Django请求里都重新实例化Twitter(),很容易导致JVM资源冲突崩溃。建议在App的配置里初始化一次,全局复用:
# 你的应用下的apps.py from django.apps import AppConfig from konlpy.tag import Twitter class YourAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'your_app' twitter_tokenizer = None def ready(self): # 启动时初始化一次分词器 self.twitter_tokenizer = Twitter()
然后在视图里这样调用:
from your_app.apps import YourAppConfig def sample_view(request): tokenizer = YourAppConfig.twitter_tokenizer result = tokenizer.pos("안녕하세요, KoNLPy 테스트입니다!") # 后续业务逻辑处理 return HttpResponse(str(result))
4. 先在外部验证KoNLPy是否正常
先写个简单的Python脚本,脱离Django环境测试KoNLPy能不能跑:
from konlpy.tag import Twitter t = Twitter() print(t.pos("안녕하세요"))
如果这个脚本也崩溃,那问题肯定出在Java或JPype的环境配置上,先把这个解决了再回到Django里调试;如果脚本能正常输出,那就是Django线程里的初始化问题,用上面第3个办法应该就能解决。
内容的提问来源于stack exchange,提问作者Zilong Li
相关产品推荐
相关产品推荐

