我正在尝试使用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()
对于解决此问题的任何建议将不胜感激。
答案 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()