无法从py4j中的Python启动网关

时间:2018-07-14 01:07:54

标签: java python py4j

我正在尝试使用JavaGateway从Python端启动py4j。这是重现我遇到的问题所需的最少文件。

  

py4j.Py4JException:此网关不存在目标对象ID:t

A.java

public class A {
}

EntryPoint.java

import py4j.GatewayServer;

public class EntryPoint {
    public A getA() {
        return new A();
    }

    public static void main(String[] args) {
        GatewayServer gatewayServer = new GatewayServer(new EntryPoint());
        gatewayServer.start();
        System.out.println("server started");
    }
}

我使用IntelliJ构建.jar文件,其中的主类为EntryPoint,而py4j.jar作为依赖项包含在内。

现在,我尝试通过引用python中生成的.jar文件的路径来启动网关。

test.py

from py4j.java_gateway import JavaGateway

gateway = JavaGateway.launch_gateway(classpath = '../out/artifacts/debugPy4j_jar/debugPy4j.jar')

a = gateway.entry_point.getA()

对于解决此问题的任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

您不能使用launch_gateway指定自定义的Main类,这意味着您无法指定入口点。您只能指定一个类路径,该类路径将附加到Py4J jar文件的路径中。

“ t”是Java端入口点的名称:由于没有入口点,Py4J无法找到对象“ t”。可以说,这种实现细节不应在面向用户的异常中泄漏。

launch_gateway被硬编码为使用py4j.GatewayServer作为主要类,因为它希望Java端以某种方式运行。

对于您而言,在启动GatewayServer之后,您仍然可以从Python创建EntryPoint的实例:

from py4j.java_gateway import JavaGateway

gateway = JavaGateway.launch_gateway(classpath='../out/artifacts/debugPy4j_jar/debugPy4j.jar')

a = gateway.jvm.A()