Как мне поступить при вызове метода Python в Java

Недавно я обнаружил py4j и смог вызывать статические методы java из python. Теперь я хочу вызывать методы Python из Java. Я не смог найти много документации, так что это последнее место, о котором я могу подумать, это может сказать мне, если это возможно, и как.

7 голосов | спросил Limnic 18 PMpFri, 18 Apr 2014 19:41:00 +040041Friday 2014, 19:41:00

1 ответ


0

Вы можете вызвать метод Python из Java, реализовав Java-интерфейс на стороне Python .

Шаги:

  1. Создайте интерфейс в Java, например, py4j.examples.Operator
  2. В Python создайте класс, а внутри класса создайте Java-класс с полем "Implements".
  3. В Python создайте экземпляр шлюза с помощью start_callback_server = True, например, gateway = JavaGateway(start_callback_server=True)
  4. В Python создайте экземпляр класса, реализующего интерфейс Java, и отправьте его на сторону Java.
  5. В Java вызовите интерфейс.

Пример адаптирован из документации Py4J:

Java-код:

// File 1
package py4j.examples;

public interface Operator {
        public int doOperation(int i, int j);
        public int doOperation(int i, int j, int k);
}

// File 2
package py4j.examples;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import py4j.GatewayServer;

public class OperatorExample {

    // To prevent integer overflow
    private final static int MAX = 1000;

    public List<Integer> randomBinaryOperator(Operator op) {
        Random random = new Random();
        List<Integer> numbers = new ArrayList<Integer>();
        numbers.add(random.nextInt(MAX));
        numbers.add(random.nextInt(MAX));
        numbers.add(op.doOperation(numbers.get(0), numbers.get(1)));
        return numbers;
    }
}

Код Python:

from py4j.java_gateway import JavaGateway

class Addition(object):
    def doOperation(self, i, j, k = None):
        if k == None:
            return i + j
        else:
            return i + j + k

    class Java:
        implements = ['py4j.examples.Operator']

if __name__ == '__main__':
    gateway = JavaGateway(start_callback_server=True)
    operator = Addition()
    operator_example = gateway.jvm.py4j.examples.OperatorExample()

    # "Sends" python object to the Java side.
    numbers = operator_example.randomBinaryOperator(operator) 
ответил Barthelemy 19 PMpSat, 19 Apr 2014 16:44:07 +040044Saturday 2014, 16:44:07

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132