我正在尝试使用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.
答案 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)");