使用Jep进行Java和Python集成

时间:2018-10-16 07:30:47

标签: java python jepp

我正在尝试使用Jep进行python和java集成。我已经使用Jep从Java程序中将泡菜文件(rf.pkl)中的randomforest模型加载为sklearn.ensemble.forest.RandomForestClassifier对象。 我希望这种加载是一次,因此我想通过从Java发送“ rfmodel”参数来调用python函数来执行在python脚本Forecast.py中定义的python函数(以使用rf模型进行预测)。 但是从Java发送到python的参数在python中被读为字符串。如何在python中将参数的数据类型保留为sklearn.ensemble.forest.RandomForestClassifier?

Jep jep = new Jep();
jep.eval("import pickle");
jep.eval("clf = pickle.load(open('C:/Downloads/DSRFmodel.pkl', 'rb'))");
jep.eval("print(type(clf))");
Object randomForest = jep.getValue("clf");

jep.eval("import integration");
jep.set("arg1", requestId);
jep.set("arg2", randomForest);
jep.eval("result = integration.trainmodel(arg1, arg2)");

------------
python.py

import pickle
def trainmodel(requestid, rf):

//when rf is printed it is 'str' format.

1 个答案:

答案 0 :(得分:1)

如果Jep如果无法识别Python类型,则将Python对象转换为Java对象时,它将返回Python对象的String表示形式,有关该行为的讨论,请参见this bug。如果您正在运行最新版本的Jep(3.8),则可以通过将Java类传递给getValue函数来覆盖此行为。创建PyObject类是用作任意python对象的通用包装。下面的代码应执行您想要的操作:

Jep jep = new Jep();
jep.eval("import pickle");
jep.eval("clf = pickle.load(open('C:/Downloads/DSRFmodel.pkl', 'rb'))");
jep.eval("print(type(clf))");
Object randomForest = jep.getValue("clf", PyObject.class);

jep.eval("import integration");
jep.set("arg1", requestId);
jep.set("arg2", randomForest);
jep.eval("result = integration.trainmodel(arg1, arg2)");