代码之家  ›  专栏  ›  技术社区  ›  Carpetfizz

无法从py4j中的python启动网关

  •  1
  • Carpetfizz  · 技术社区  · 6 年前

    我想启动一个 JavaGateway 从python端使用 py4j 是的。以下是复制我遇到的问题所需的最少文件。

    Py4j.Py4JExt:该网关不存在目标对象ID:T

    爪哇

    public class A {
    }
    

    入口点.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编写的文件。

    Py

    from py4j.java_gateway import JavaGateway
    
    gateway = JavaGateway.launch_gateway(classpath = '../out/artifacts/debugPy4j_jar/debugPy4j.jar')
    
    a = gateway.entry_point.getA()
    

    如能就解决这一问题提出任何建议,我们将不胜感激。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Barthelemy    6 年前

    不能使用launch_gateway指定自定义主类,这意味着您不能指定入口点。您只能指定一个类路径,它被附加到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()