Skip to main content
 首页 » 编程设计

java之py4j:如何从 Python 启动 java 网关

2025年05月04日32haluo1

我可以通过打开我的 Java 程序然后使用以下 Python 代码与 Python 中的示例 Java 程序进行交互:

from py4j.java_gateway import JavaGateway 
gg = JavaGateway() 
sw = gg.entry_point.getInstance() 
sw.run() 
... 

然而,这样做的缺点是我必须在使用此代码之前以某种方式打开 Java 程序。

我发现有一个叫做 launch_gateway 的方法,看起来很方便。

py4j.java_gateway.launch_gateway(jarpath="path_to_my_jar.jar") 

但是,如果以这种方式启动,我无法连接到我的 Java 程序。

我尝试使用以下代码:

port = py4j.java_gateway.launch_gateway(jarpath="path_to_my_jar.jar") 
gp = GatewayParameters(port=port)  
gg = JavaGateway(gateway_parameters=gp) 
sw = gg.entry_point.getInstance() 

但是我得到以下错误:

An error occurred while calling t.getInstance. Trace: 
py4j.Py4JException: Target Object ID does not exist for this gateway :t 

我想我尝试连接到网关的方式有问题。

有什么建议吗?

谢谢

请您参考如下方法:

巴泰勒米,你是对的!我最初误解了它的工作原理。

launch_gateway 在 py4j.jar 中运行网关,这对于与标准 JVM 交互很有用,但显然不包含自定义代码。

但是,正如您所建议的,classpath 参数允许您加载额外的自定义 Java 代码。

这是一个“最小的例子”:

from py4j.java_gateway import JavaGateway  
gg = JavaGateway.launch_gateway(classpath="/path/my_jar.jar") 
 
myclass_instance = gg.jvm.my_class_package_name.MyClass() 
result = myclass_instance.my_method() 

请注意,my_jar.jar 不必启动网关。

launch_gateway 为您提供了不错的功能,例如:die_on_exit、stdout/stdin 重定向和自动端口选择。