首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >py4j:如何从Python启动java网关

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

Stack Overflow用户
提问于 2017-03-16 05:48:52
回答 2查看 6.2K关注 0票数 4

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

代码语言:javascript
复制
from py4j.java_gateway import JavaGateway
gg = JavaGateway()
sw = gg.entry_point.getInstance()
sw.run()
...

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

我发现有一种叫做launch_gateway的方法,它似乎非常方便地达到了这个目的。

代码语言:javascript
复制
py4j.java_gateway.launch_gateway(jarpath="path_to_my_jar.jar")

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

我尝试使用以下代码:

代码语言:javascript
复制
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()

但我得到了以下错误:

代码语言:javascript
复制
An error occurred while calling t.getInstance. Trace:
py4j.Py4JException: Target Object ID does not exist for this gateway :t

我想我在尝试连接到网关时做错了什么。

有什么建议吗?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-17 21:48:29

巴斯密,你说得对!一开始我误解了这是怎么回事。

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

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

这是一个“最低限度的例子”:

代码语言:javascript
复制
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重定向和自动端口选择。

票数 9
EN

Stack Overflow用户

发布于 2017-03-17 07:52:28

我看到两个潜在的问题:

  1. jarpath应该是Py4J的jar的路径。您可以在launch_gateway的类路径参数中添加库。
  2. 当您从py4j.GatewayServer启动launch_gateway时,没有指定任何入口点--实际上,entry_point可以这么做
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42826221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档