最近在学习如何将c++的代码嵌入到python中,网上的方法很多,这里先介绍了解到两种方式:ctypes和Cython。
ctypes是python里的包,Cython是python的超集,也可以将其理解成新的语言,与纯python的区别就是可以定义变量的类型,类似c语言,主要是为了提升性能,具体可以参考:
使用 Cython 提高 Python 性能:
https://www.linkedin.com/pulse/improving-python-performance-cython-harold-kasperink-yttse
对于ctypes模块,其是Python标准库中提供的一个用于调用C语言动态链接库的模块。
关于动态链接库可以参考:
程序员的自我修养–链接、装载与库笔记:动态链接:
彻底搞懂动态库、静态库、运行时库、引入库之间的区别:
https://www.51cto.com/article/606673.html
使用ctypes模块的步骤如下:
1 导入ctypes模块
import ctypes
2 定义C语言函数的返回类型和参数类型
# 定义返回值类型为int,参数类型为int和int的函数
func = ctypes.CDLL('mylib.dll').my_c_function
func.restype = ctypes.c_int
func.argtypes = [ctypes.c_int, ctypes.c_int]
3 调用C语言函数
# 调用C语言函数,并传入参数
result = func(10, 20)
上面的案例比较简单,少了编译成.dll/.so文件的步骤,可以参考:
DLL的生成与加载(c++、java、python):
python与c混合编程:
对于cython,其是一个将Python代码转换为C语言代码的工具。它允许我们在Python代码中使用C语言的特性,并将其编译成高效的机器码。使用Cython的步骤如下:
1 安装Cython模块
pip install cython
2 创建一个.pyx文件,并将需要使用C语言的代码放入其中
# mymodule.pyx
cdef int my_c_function(int a, int b):
return a + b
3 编写一个setup.py文件,用于将.pyx文件编译成C语言的扩展模块
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
ext = Extension("mymodule", sources=["mymodule.pyx"])
setup(
name="mymodule",
ext_modules=cythonize(ext)
)
编译并安装扩展模块
python setup.py build_ext –inplace
在Python代码中导入扩展模块,并调用C语言函数
import mymodule
result = mymodule.my_c_function(10, 20)
对于Cython也是将文件编译成.so后再进行调用,不过比ctypes多了一种方式,就是用pyximport来直接调用,具体可以参考:
源文件和编译:
https://www.kancloud.cn/apachecn/cython-doc-zh/1944795 编译Cython代码的方式
关于C++,可以参考:
在 Cython 中使用 C :
https://github.com/apachecn/cython-doc-zh/blob/master/docs/31.md Cython与C/C的交互
https://zyxin.xyz/blog/2019-08/cython-interop/
浅谈Python程序与C++程序的联合使用:
https://www.jb51.net/article/63623.htm
总的来说:ctypes模块允许Python代码直接调用C语言函数,适用于只需要调用少量C语言函数的情况;Cython模块可以将Python代码转换成C语言代码,并编译成高效的机器码,适用于需要将大量Python代码转换为C语言的情况。
参考:https://worktile.com/kb/ask/99010.html