9

私は最近py4jを発見し、Pythonから静的Javaメソッドを呼び出すことができました。今度は、Java から Python メソッドを呼び出したいと思います。多くのドキュメントを見つけることができなかったので、これが可能かどうか、またその方法を教えてくれる最後の場所です。

4

1 に答える 1

10

Python 側で Java インターフェイスを実装することにより、Java から Python メソッドを呼び出すことができます。

手順は次のとおりです。

  1. py4j.examples.Operator など、Java でインターフェースを作成します。
  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;
    }
}

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) 
于 2014-04-19T12:44:07.877 に答える