在python里調用java的py4j的使用方法


py4j可以使python和java互調

 

py4j並不會開啟jvm,需要先啟動jvm server,然后再使用python的client去連接jvm

 

 

 

GatewayServer實例:允許python程序通過本地網絡socket來與JVM通信。

 

1、安裝:pip install py4j

其中Python庫會安裝到Python目錄,而Java庫會安裝到對應的目錄,如/usr/local/share/py4j/py4j0.10.5.jar。​

2、啟動Java虛擬機

要讓Python代碼調用JVM函數,需要先使用Py4J的Java庫,啟動一個JVM監聽socket端口,代碼如下,其中py4j.GatewayServer在前面安裝得到的py4j0.10.5.jar包中。

AdditionApplication.java


import py4j.GatewayServer; public class AdditionApplication { public int addition(int first, int second) { return first + second; } public static void main(String[] args) { AdditionApplication app = new AdditionApplication(); // app is now the gateway.entry_point GatewayServer server = new GatewayServer(app);
  //GatewayServer server = new GatewayServer(app,25334); //使用其他端口 server.start(); //開始接收python請求 } }

 編譯:

​javac -cp /usr/local/share/py4j/py4j0.10.5.jar  AdditionApplication.java

運行:默認會使用25333端口,可以lsof -i:25333進行查看

java -cp /usr/local/share/py4j/py4j0.10.5.jar :. AdditionApplication​

 

啟動Python客戶端

最后啟動Python客戶端就可以,通過Py4J提供的Python庫,根據ip、port連接JVM啟動的socket server,然后就可以使用Java實現的類了,而且類的屬性和成員函數都可以dynamic使用。

>>> from py4j.java_gateway import JavaGateway

>>> gateway = JavaGateway()                   # connect to the JVM ,初始化一個JavaGateway,默認為localhost,端口25333

使用java自帶的庫 >>> random = gateway.jvm.java.util.Random() # create a java.util.Random instance >>> number1 = random.nextInt(10) # call the Random.nextInt method >>> number2 = random.nextInt(10) >>> print(number1,number2) (2, 7)
使用AdditionApplication服務的函數
>>> addition_app = gateway.entry_point # get the AdditionApplication instance >>> addition_app.addition(number1,number2) # call the addition method 9

如果要使用第三方的包,必須在運行時先包含進來,然后才可以使用:
引用第三方包my.jar,並使用里面的方法cn.huawei.tongdun.Add
java -cp /usr/local/share/py4j/py4j0.10.5.jar :/usr/local/my.jar:. AdditionApplication​
third_add = gateway.jvm.cn.huawei.tongdun.Add

 

剛開始,遇到找不到類的情況時,我想着把需要的jar包放入CLASSPATH下,但是失敗告終

 

總結

Py4J​為Python調用JVM程序提供了很簡易的接口,為Java/Scala應用提供Python API提供便利。Spark基於Py4J實現了PySpark也非常好用,在實際開發中除了啟動GatewayServer,還需要處理多線程並發、SparkContext封裝等工作。

類似Py4J,如果需要Python​調用C/C++后端,還可以使用swig,參考 TensorFlow 的實現。​​​​

 

參考:

1、https://weibo.com/ttarticle/p/show?id=2309404123715523750791&mod=zwenzhang

2、http://blog.csdn.net/u010159842/article/details/69251773

3、https://www.py4j.org/install.html#install-instructions

4、https://www.py4j.org/faq.html#how-to-import-a-class


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM