最近在学习如何将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