我最近发现了 py4j 并且能够从 python 调用静态 java 方法。现在我想从java调用python方法。我找不到太多文档,所以这是我能想到的最后一个可以告诉我是否可能以及如何实现的地方。
您可以通过以下方式从 Java 调用 Python 方法在Python端实现Java接口 http://py4j.sourceforge.net/advanced_topics.html#implementing-java-interfaces-from-python-callback.
步骤是:
- 在 Java 中创建一个接口,例如 py4j.examples.Operator
- 在 Python 中,创建一个类,并在该类中创建一个带有“implements”字段的 Java 类。
- 在 Python 中,使用 start_callback_server=True 实例化网关,例如,
gateway = JavaGateway(start_callback_server=True)
- 在Python中,实例化实现Java接口的类并将其发送到Java端。
- 在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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)