• 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'
  • 相关阅读:
    LLM:Rope旋转位置编码个人理解和总结
    【Flutter】Dio 强大的Dart/Flutter HTTP客户端
    究极异常处理逻辑——多层次异常的处理顺序
    【电商API接口的应用:电商数据分析入门】初识Web API(一)
    Java 泛型:理解和应用
    springcloud商城源码
    CPU段访问控制:特权级(RPL CPL DPL)和代码段一致性
    目标检测YOLO实战应用案例100讲-高速铁路供电安全检测监测系统图像智能识别
    【Anoconda】安装 miniconda
    电磁场与电磁波part1--矢量分析
  • 原文地址:https://blog.csdn.net/u012206617/article/details/127971821