如何使用 PY4J 从 python 调用 java

Posted

技术标签:

【中文标题】如何使用 PY4J 从 python 调用 java【英文标题】:How to call java from python using PY4J 【发布时间】:2014-01-12 07:07:46 【问题描述】:

我想用 Py4J 库从 python 调用 java,

from py4j.java_gateway import JavaGateway
gateway = JavaGateway()                        # connect to the JVM
gateway.jvm.java.lang.System.out.println('Hello World!')

我收到以下错误:“Py4JNetworkError:尝试连接到 Java 服务器时出错”。好像没有JVM在运行,如何解决?

【问题讨论】:

您不需要主机名和/或端口来连接到 REMOTE JVM 吗? 【参考方案1】:

最小的工作示例:

//AdditionApplication.java
import py4j.GatewayServer;

public class AdditionApplication 

  public static void main(String[] args) 
    AdditionApplication app = new AdditionApplication();
    // app is now the gateway.entry_point
    GatewayServer server = new GatewayServer(app);
    server.start();
  

编译(确保py4j的-cp路径有效,否则调整到正确位置):

javac -cp /usr/local/share/py4j/py4j0.9.jar AdditionApplication.java

运行它:

java -cp .:/usr/local/share/py4j/py4j0.9.jar AdditionApplication

现在,如果您运行 python 脚本,在运行 java AdditionApplication 的终端中,您应该会看到如下内容:

>>> Hello World!

【讨论】:

我认为你的意思是你的类路径中的 ; 不是 : 取决于您使用的平台。 : 在 UNIX 上或 ; 在 Windows 上。有关该主题的更多信息可以找到here。【参考方案2】:
package test.test;

import py4j.GatewayServer;

public class AdditionApplication 
    public int addition(int first, int second) 
        return first + second;
      

      public static void main(String[] args) 
        AdditionApplication app = new AdditionApplication();
        // app is now the gateway.entry_point
        GatewayServer server = new GatewayServer(app);
        server.start();
      

新建一个类并运行它(首先在'py4j-0.8\py4j-0.8\py4j-java'处导入py4j0.8.jar),然后运行python程序

【讨论】:

【参考方案3】:

你应该先启动java程序,然后从python调用java方法。

py4j 不启动 jvm,它只是连接到已经启动的 java 进程。

【讨论】:

以上是关于如何使用 PY4J 从 python 调用 java的主要内容,如果未能解决你的问题,请参考以下文章

py4j:如何从 Python 启动 java 网关

使用 py4j 将矩阵作为 int[][] 数组从 Python 发送到 Java

来自 Java Runnable 的 Py4J 回调

如何停止 Python 运行 Py4J ClientServer

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

如何使用 QT/python 从 Javascript 调用 C++ 函数?