py4j - How would I go about on calling a python method in java

前端 未结 1 1421
梦谈多话
梦谈多话 2021-02-06 04:13

I\'ve recently discovered py4j and was able to call static java methods from python. Now I want to call python methods from java. I couldn\'t find much documentation so this is

1条回答
  •  清歌不尽
    2021-02-06 05:11

    You can call a Python method from Java by implementing a Java interface on the python side.

    The steps are:

    1. Create an interface in Java, e.g., py4j.examples.Operator
    2. In Python, create a class and inside the class, create a Java class with an "implements" field.
    3. In Python, instantiate a gateway with start_callback_server=True, e.g., gateway = JavaGateway(start_callback_server=True)
    4. In Python, instantiate the class implementing a Java interface and send it to the Java side.
    5. In Java, call the interface.

    Example adapted from the Py4J documentation:

    Java code:

    // 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 randomBinaryOperator(Operator op) {
            Random random = new Random();
            List numbers = new ArrayList();
            numbers.add(random.nextInt(MAX));
            numbers.add(random.nextInt(MAX));
            numbers.add(op.doOperation(numbers.get(0), numbers.get(1)));
            return numbers;
        }
    }
    

    Python code:

    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) 
    

    0 讨论(0)
提交回复
热议问题