前言
上一篇介紹了Java采用Jython調(diào)用python程序的方式,但是問題是目前只支持python2.x,如果需要調(diào)用python3.x目前是無法做到的,所以想到另外一種方式,把python程序編譯成c++的動(dòng)態(tài)庫(so文件),然后Java采用JNI的方式去調(diào)用,這樣不僅能實(shí)現(xiàn)多語言的調(diào)用,而且執(zhí)行效率也會(huì)比較高。
示例
- 首先編寫測(cè)試用的python腳本
test.py
def wdd(a, b):
return a + b
- 采用distutils工具進(jìn)行打包,需要編寫初始配置
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules=cythonize("test.py")
)
- 編譯動(dòng)態(tài)庫(.so)文件
~/anaconda3/bin/python3 setup.py build_ext
- 同級(jí)目錄下會(huì)生成build目錄,目錄下面有打包好的執(zhí)行文件
test.cpython-37m-x86_64-linux-gnu.so
注意:C動(dòng)態(tài)庫是分平臺(tái)的,所以代碼運(yùn)行在哪個(gè)平臺(tái),就需要在那個(gè)平臺(tái)打包,我是在linux上打的
- 調(diào)用動(dòng)態(tài)庫
from test import wdd
val = wdd(1, 1)
print(val)
輸出結(jié)果為2,符合預(yù)期
結(jié)
目前只是用python調(diào)用了下動(dòng)態(tài)庫,并沒有用Java的JNI去調(diào)用,原因是我需要編譯的項(xiàng)目比較大,文件太多,而且還涉及到一些模型文件,編譯會(huì)遇到很多問題,所以這種方案也pass掉了。最終的方案選用pyflink,本來flink也是支持多語言的,pyflink就是專門用來與python生態(tài)打通,所以目前這種場(chǎng)景pyflink是個(gè)不錯(cuò)的選擇。