Cpython简单介绍

前言

上一篇介绍了Java采用Jython调用python程序的方式,但是问题是目前只支持python2.x,如果需要调用python3.x目前是无法做到的,所以想到另外一种方式,把python程序编译成c++的动态库(so文件),然后Java采用JNI的方式去调用,这样不仅能实现多语言的调用,而且执行效率也会比较高。

示例

  1. 首先编写测试用的python脚本
    test.py
def wdd(a, b):
    return a + b
  1. 采用distutils工具进行打包,需要编写初始配置
from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize("test.py")
)
  1. 编译动态库(.so)文件

~/anaconda3/bin/python3 setup.py build_ext

  1. 同级目录下会生成build目录,目录下面有打包好的执行文件

test.cpython-37m-x86_64-linux-gnu.so

注意:C动态库是分平台的,所以代码运行在哪个平台,就需要在那个平台打包,我是在linux上打的

  1. 调用动态库
from test import wdd

val = wdd(1, 1)
print(val)

输出结果为2,符合预期

目前只是用python调用了下动态库,并没有用Java的JNI去调用,原因是我需要编译的项目比较大,文件太多,而且还涉及到一些模型文件,编译会遇到很多问题,所以这种方案也pass掉了。最终的方案选用pyflink,本来flink也是支持多语言的,pyflink就是专门用来与python生态打通,所以目前这种场景pyflink是个不错的选择。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容