py4j - 我将如何在java中调用python方法

Lim*_*nic 9 java py4j

我最近发现py4j并且能够从python调用静态java方法.现在我想从java调用python方法.我找不到太多的文档,所以这是我能想到的最后一个地方,可能会告诉我它是否可能,以及如何.

Bar*_*emy 8

您可以通过在python端实现Java接口从Java调用Python方法.

步骤是:

  1. 用Java创建一个接口,例如py4j.examples.Operator
  2. 在Python中,创建一个类并在类中创建一个带有"implements"字段的Java类.
  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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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) 
Run Code Online (Sandbox Code Playgroud)