3.使用 Cython 工具编译生成动态库
补充做一个小小的准备工作:把Python源码文件的后缀从
.py
改成
.pyx
python源代码Test.pyx和main.c文件都准备就绪,接下来便是
Cython
登场的时候了,它将会将所有pyx的文件自动转换成.c文件,并结合我们自己的main.c文件,内部调用gcc生成一个动态二进制库文件。
Cython 的工作需要准备一个 setup.py 文件,配置好转换的编译信息,包括输入文件、输出文件、编译参数、包含目录、链接目录,如下所示:
from distutils.core import setup
from Cython.Build import cythonize
from distutils.extension import Extension
sourcefiles = ['Test.pyx', 'main.c']
extensions = [Extension("libTest", sourcefiles,
include_dirs=['/Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/include',
'/Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/include/darwin/',
'/Library/Frameworks/Python.framework/Versions/3.6/include/python3.6m'],
library_dirs=['/Library/Frameworks/Python.framework/Versions/3.6/lib/'],
libraries=['python3.6m'])]
setup(ext_modules=cythonize(extensions, language_level = 3))
注意:
这里涉及Python二进制代码的编译,需要链接Python的库
注意:
这里涉及JNI相关数据结构定义,需要包含Java JNI目录
setup.py文件准备就绪后,便执行如下命令,启动转换+编译工作:
python3.6 setup.py build_ext --inplace