java中使用jep调用python类

发布时间 2023-05-21 18:34:39作者: 海_纳百川

经过调研,目前这应该只有一种调用方式了,那就是使用jep,后来亲测了以下确实是可行,我是使用jep调用了一个python文件中的类,并测试了类的一个方法,可以正常执行,但是具体速度会不会慢很多,我还没有测试。

刚开始在调研的时候,说jython也可以调用,但是这个包只支持2.7python,毕竟现在很少有用2.7的了,所以转2.7就比较麻烦,甚至有可能无法实现。

关于jep的使用,首先需要强调的是,jep是使用pip安装的,我刚开始在想java使用为什么要使用pip安装(pip install jep ),https://github.com/ninia/jep,原来这种安装方式会创建python包,和java的jar包,在两个语言中都可以互相调用。

关于jep的安装需要gcc,java,要配置好JAVA_HOME

安装好jep以后,调用方式为:

import jep.*;
public class test_2 {
    public static void main(String[] args) {
    try (Interpreter interp = new SharedInterpreter()) {
        interp.exec("from java.lang import System");
        interp.exec("s = 'Hello World'");
        interp.exec("System.out.println(s)");
        interp.exec("print(s)");
        interp.exec("print(s[1:-1])");
    } catch (Exception e) {
        e.printStackTrace();
    }
     }       
}
//注意,exec中可以直接按照python的代码来写就行了,另外还有别的写法,官方还给出了其他的类调用方法,可以自行尝试,在这里https://github.com/ninia/jep/wiki/Getting-Started

最后将上述代码保存为test_2.java

编译:javac -cp jep-版本号.jar的绝地地址 test_2.java

执行 :java -cp  jep-版本号.jar的绝地地址:. test_2

上述执行命令中,以我的jep.jar绝对地址为例,我的是在/usr/local/lib64/python3.6/site-packages/jep-4.1.1-py3.6-linux-x86_64.egg/jep/jep-4.1.1.jar