• pyhandlp报错:No such file or directory: ‘/usr/lib/jvm‘


    原因

    JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足。
    JPype的实际运行环境仍然是python runtime,只是在运行期间启动了一个嵌入的jvm。

    找不到jvm,大概原因是环境变量没有生效。

    可以看到是在执行_jvmfinder.py文件的find_possible_homes遇到的问题,于是打开这个文件去看了报错文件的源代码。我们在调用hanlp时将运行_jvmfinder.py的get_jvm_path()函数来获取系统的java路径,get_jvm_path定义如下

    1. # 第147行
    2. def get_jvm_path(self):
    3. """
    4. Retrieves the path to the default or first found JVM library
    5. Returns:
    6. The path to the JVM shared library file
    7. Raises:
    8. ValueError: No JVM library found or No Support JVM found
    9. """
    10. jvm_notsupport_ext = None
    11. for method in self._methods:
    12. try:
    13. jvm = method()
    14. # If found check the architecture
    15. if jvm:
    16. self.check(jvm)
    17. # 后面 略

    而get_jvm_path()实际上是运行self._methods中的方法,我们再看self._methods的定义(__init__()中):

    1. # 第62行左右
    2. # Search methods
    3. self._methods = (self._get_from_java_home,
    4. self._get_from_known_locations)

     _methods中存的是本文件的另外两个函数,先运行_get_from_java_home(),如果没找到再运行_get_from_known_locations()。前面我们报错的是_get_from_known_locations(),那也就是说_get_from_java_home()没有成功找到java,来看这个函数的定义:

    1. # 第186行
    2. def _get_from_java_home(self):
    3. """
    4. Retrieves the Java library path according to the JAVA_HOME environment
    5. variable
    6. Returns:
    7. The path to the JVM library, or None
    8. """
    9. # Get the environment variable
    10. java_home = os.getenv("JAVA_HOME")
    11. if java_home and os.path.exists(java_home):
    12. # Get the real installation path
    13. java_home = os.path.realpath(java_home)
    14. # Cygwin has a bug in realpath
    15. if not os.path.exists(java_home):
    16. java_home = os.getenv("JAVA_HOME")
    17. # Look for the library file
    18. return self.find_libjvm(java_home)

    这个函数主要通过获取系统环境变量JAVA_HOME来得到java的地址。可是命令行中运行java正常,为什么没找到这个环境变量呢? 重新查看一下配置文件/etc/profile中java环境变量的配置,如下 

    1. # set java path
    2. JAVA_HOME=/usr/local/java/latest
    3. export PATH=${JAVA_HOME}/bin:${PATH}
    4. export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

    平时在命令行中能直接运行java,是因为java所在的bin目录被添加到PATH,且由export PATH后作为环境变量生效。但是JAVA_HOME只是作为普通变量,使用os.getenv()的时候获取环境变量时找不到JAVA_HOME,所以推测应该只要将JAVA_HOME前面添加export,重启项目即可。

    pyhandlp在运行时缺少java依赖,需要找到该系统的java环境变量,设置寻找到即可

    解决方法

    找到JAVA_HOME环境变量,设置即可

    1. # set java path
    2. export JAVA_HOME=/usr/local/java/latest
    3. export PATH=${JAVA_HOME}/bin:${PATH}
    4. export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

    在全局配置文件/etc/profile或个人配置文件~/.bashrc或~/.bash_profile中添加export JAVA_HOME即可,如下是我的/etc/profile的设置:

    在 import pyhandlp上面添加

    1. # 设置环境变量
    2. import os
    3. os.environ['JAVA_HOME'] = '/usr/local/java/latest'
  • 相关阅读:
    sqoop笔记(安装、配置及使用)
    华为策略流控
    直播带货用什么成交话术可以提高销量
    识别手势语言
    [EIS 2019]EzPOP
    XSS 安全漏洞介绍及修复方案
    基于 Prometheus 和 Zabbix 实现容器云平台整体监控方案
    HTML网页设计制作大作业(游戏主题)---电竞
    【shell 特殊字符】
    DGL学习笔记——第一章 图
  • 原文地址:https://blog.csdn.net/u012206617/article/details/127971821