2017-03-16 77 views
1
啓動Java網關

我能夠用在Python我的示例Java程序進行交互,打開我的Java程序,然後使用下面的Python代碼:py4j:如何從Python的

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 

我想我做一些錯誤的方式,我嘗試連接到網關。

有什麼建議嗎?

感謝

回答

0

繆,你是對的!我最初誤解了這是如何工作的。

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,標準輸出/標準輸入重定向和自動端口選擇。

1

我看到兩個潛在的問題:

  1. jarpath應該是路徑Py4J的罐子。您可以將其添加到launch_gateway的classpath參數中。
  2. 當你開始從launch_gateway一個py4j.GatewayServer,有那麼確實沒有指定入口點,入口點做