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

Posted

技术标签:

【中文标题】py4j - 我将如何在 java 中调用 python 方法【英文标题】:py4j - How would I go about on calling a python method in java 【发布时间】:2014-06-03 03:47:50 【问题描述】:

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

【问题讨论】:

可能重复:***.com/questions/14450173/… 【参考方案1】:

您可以通过 implementing a Java interface on the python side 从 Java 调用 Python 方法。

步骤如下:

    在 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) 

【讨论】:

很好的例子。您能告诉我们如何使用 py4j 0.8.2.1 实现这一目标 我们可以在给定.py文件的情况下调用python函数而不需要修改python脚本。使用 Jython PythonInterpreter,我们可以straight a way call function defined in the python file。 py4j 有类似的可能吗? @Mahesha999 不,不可能直接从 Java 解释 python 代码,但您可能对 Eclipse EASE 感兴趣,它提供了一个可以实现这一点的环境。 嘿,谢谢你的好例子。我也需要从 java 端调用 python,但是 python 函数应该返回一个巨大的浮点值数组。我该怎么做? 这里,python 代码正在向 Java 发送对象。如果我想要控制流,以便 Java 代码可以在需要时调用 python 函数。 py4j 可以吗?

以上是关于py4j - 我将如何在 java 中调用 python 方法的主要内容,如果未能解决你的问题,请参考以下文章

来自 Java Runnable 的 Py4J 回调

如何在 py4j 中将 Java 列表转换为 Python 列表

py4j:如何从 Python 启动 java 网关

如何隐藏“py4j.java_gateway:Received command c on object id p0”?

使用 py4j 在 java/python 项目中将 Log4j 连接到 ipython notebook stderr

Java 数组到 NumPy 数组的快速转换 (Py4J)