前言
上一篇介绍了Java采用Jython调用python程序的方式,但是问题是目前只支持python2.x,如果需要调用python3.x目前是无法做到的,所以想到另外一种方式,把python程序编译成c++的动态库(so文件),然后Java采用JNI的方式去调用,这样不仅能实现多语言的调用,而且执行效率也会比较高。
示例
- 首先编写测试用的python脚本
test.py
def wdd(a, b):
return a + b
- 采用distutils工具进行打包,需要编写初始配置
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules=cythonize("test.py")
)
- 编译动态库(.so)文件
~/anaconda3/bin/python3 setup.py build_ext
- 同级目录下会生成build目录,目录下面有打包好的执行文件
test.cpython-37m-x86_64-linux-gnu.so
注意:C动态库是分平台的,所以代码运行在哪个平台,就需要在那个平台打包,我是在linux上打的
- 调用动态库
from test import wdd
val = wdd(1, 1)
print(val)
输出结果为2,符合预期
结
目前只是用python调用了下动态库,并没有用Java的JNI去调用,原因是我需要编译的项目比较大,文件太多,而且还涉及到一些模型文件,编译会遇到很多问题,所以这种方案也pass掉了。最终的方案选用pyflink,本来flink也是支持多语言的,pyflink就是专门用来与python生态打通,所以目前这种场景pyflink是个不错的选择。