JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足。
JPype的实际运行环境仍然是python runtime,只是在运行期间启动了一个嵌入的jvm。
找不到jvm,大概原因是环境变量没有生效。
可以看到是在执行_jvmfinder.py文件的find_possible_homes遇到的问题,于是打开这个文件去看了报错文件的源代码。我们在调用hanlp时将运行_jvmfinder.py的get_jvm_path()函数来获取系统的java路径,get_jvm_path定义如下
- # 第147行
- def get_jvm_path(self):
- """
- Retrieves the path to the default or first found JVM library
- Returns:
- The path to the JVM shared library file
- Raises:
- ValueError: No JVM library found or No Support JVM found
- """
- jvm_notsupport_ext = None
- for method in self._methods:
- try:
- jvm = method()
-
- # If found check the architecture
- if jvm:
- self.check(jvm)
-
- # 后面 略
而get_jvm_path()实际上是运行self._methods中的方法,我们再看self._methods的定义(__init__()中):
- # 第62行左右
- # Search methods
- self._methods = (self._get_from_java_home,
- self._get_from_known_locations)
_methods中存的是本文件的另外两个函数,先运行_get_from_java_home(),如果没找到再运行_get_from_known_locations()。前面我们报错的是_get_from_known_locations(),那也就是说_get_from_java_home()没有成功找到java,来看这个函数的定义:
- # 第186行
- def _get_from_java_home(self):
- """
- Retrieves the Java library path according to the JAVA_HOME environment
- variable
- Returns:
- The path to the JVM library, or None
- """
- # Get the environment variable
- java_home = os.getenv("JAVA_HOME")
- if java_home and os.path.exists(java_home):
- # Get the real installation path
- java_home = os.path.realpath(java_home)
-
- # Cygwin has a bug in realpath
- if not os.path.exists(java_home):
- java_home = os.getenv("JAVA_HOME")
-
- # Look for the library file
- return self.find_libjvm(java_home)
这个函数主要通过获取系统环境变量JAVA_HOME来得到java的地址。可是命令行中运行java正常,为什么没找到这个环境变量呢? 重新查看一下配置文件/etc/profile中java环境变量的配置,如下
- # set java path
- JAVA_HOME=/usr/local/java/latest
- export PATH=${JAVA_HOME}/bin:${PATH}
- 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环境变量,设置即可
- # set java path
- export JAVA_HOME=/usr/local/java/latest
- export PATH=${JAVA_HOME}/bin:${PATH}
- export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
在全局配置文件/etc/profile或个人配置文件~/.bashrc或~/.bash_profile中添加export JAVA_HOME即可,如下是我的/etc/profile的设置:
在 import pyhandlp上面添加
- # 设置环境变量
- import os
- os.environ['JAVA_HOME'] = '/usr/local/java/latest'