#java #python #py4j
Вопрос:
Я хочу отправлять массивы double
s (или float
s) с Java на Python с помощью Py4J. Но, похоже, это не работает. Вот мой MWE на стороне Java.
Основная программа
public class TheExample {
private double sq[];
public double twoTimes(double element) {
return 2*element ;
}
public double[] squares(double x, double y) {
sq = new double[2];
sq[0] = x*x ;
sq[1] = y*y ;
return sq ;
}
}
Программа точки входа
import py4j.GatewayServer;
public class TheExampleEntryPoint {
private TheExample thex;
public TheExampleEntryPoint() {
thex = new TheExample();
}
public TheExample getThex() {
return thex;
}
public static void main(String[] args) {
GatewayServer gatewayServer = new GatewayServer(new TheExampleEntryPoint());
gatewayServer.start();
System.out.println("Gateway Server Started");
}
}
После запуска сервера шлюза я получил доступ к объекту из Python:
>>> from py4j.java_gateway import JavaGateway
>>> gateway = JavaGateway()
>>> thex = gateway.entry_point.getThex()
>>> thex.twoTimes(9.0)
18.0
>>> thex.squares(2.0, 3.0)
JavaObject id=o1
>>> ### ??? The surprise
Как правильно отправить массив double
s или float
s из Java в Python?
Мой вариант использования прост: мне нужно только получить значения из Java. Нет необходимости иметь возможность изменять массив ( list
на стороне Python). Следовательно, если получить его как tuple
» а » возможно и проще, это еще лучше.
Спасибо!
Ответ №1:
Мое текущее решение состоит в том, чтобы использовать List
в Java, как показано ниже:
Основная программа
import java.util.List;
import java.util.ArrayList;
public class TheExample {
public double twoTimes(double element) {
return 2*element ;
}
public List<Double> squares(double x, double y) {
List<Double> sq = new ArrayList<Double>();
sq.add(x*x) ;
sq.add(y*y) ;
return sq ;
}
}
И это работает, как и ожидалось, на стороне Python:
>>> from py4j.java_gateway import JavaGateway
>>> gateway = JavaGateway()
>>> thex = gateway.entry_point.getThex()
>>> thex.twoTimes(9.0)
18.0
>>> thex.squares(2.0, 3.0)
[4.0, 9.0]