2

我正在尝试使用 Jep 进行 python 和 java 集成。我已经从使用 Jep 的 java 程序中将随机森林模型从 pickle 文件(rf.pkl)加载为 sklearn.ensemble.forest.RandomForestClassifier 对象。我希望这种加载是一次,所以我想通过从 java 发送“rfmodel”参数来调用 python 函数来执行 python 脚本 prediction.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.
4

1 回答 1

3

当 Jep 将 Python 对象转换为 Java 对象时,如果它无法识别 Python 类型,它将返回 Python 对象的字符串表示,请参阅此错误以了解有关该行为的讨论。如果您正在运行最新版本的 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)");
于 2018-10-18T18:08:38.993 回答