py4j:如何从Python启动java网关

时间:2017-03-16 05:48:53

标签: java python py4j

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

rpart_1 <- rpart(myFormula, data = kyphosis,
                 method = "class", 
                 control = rpart.control(minsplit = 0, cp = 0))
plotcp(rpart_1)
printcp(rpart_1)

然而,这有一个缺点,即在使用此代码之前我必须以某种方式打开Java程序。

我发现有一个名为launch_gateway的方法对于这个目标看起来非常方便。

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

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

我尝试使用以下代码:

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

但是我收到以下错误:

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()

我想我在尝试连接网关的方式上做错了。

有什么建议吗?

由于

2 个答案:

答案 0 :(得分:4)

巴塔勒米,你是对的!我最初误解了它是如何工作的。

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

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

这是一个&#34;最小的例子&#34;:

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重定向和自动端口选择。

答案 1 :(得分:1)

我发现了两个潜在的问题:

  1. jarpath应该是Py4J jar的路径。您可以在launch_gateway的classpath参数中添加库。
  2. 当您从launch_gateway启动py4j.GatewayServer时,没有指定入口点,所以确实,entry_point