py4j可使python和java互調html
py4j並不會開啓jvm,須要先啓動jvm server,而後再使用python的client去鏈接jvmjava
GatewayServer實例:容許python程序經過本地網絡socket來與JVM通訊。python
一、安裝:pip install py4jgit
其中Python庫會安裝到Python目錄,而Java庫會安裝到對應的目錄,如/usr/local/share/py4j/py4j0.10.5.jar。github
要讓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客戶端就能夠,經過Py4J提供的Python庫,根據ip、port鏈接JVM啓動的socket server,而後就可使用Java實現的類了,並且類的屬性和成員函數均可以dynamic使用。app
>>> 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 的實現。
參考:
一、https://weibo.com/ttarticle/p/show?id=2309404123715523750791&mod=zwenzhang
二、http://blog.csdn.net/u010159842/article/details/69251773
三、https://www.py4j.org/install.html#install-instructions
四、https://www.py4j.org/faq.html#how-to-import-a-class