CTypes

Python 中的 ctypes 模块可能是 Python 调用 C 方法中最简单的一种。ctypes 模块提供了和 C 语言兼容的数据类型和函数来加载 dll 文件,因此在调用时不需对源文件做任何的修改。也正是如此奠定了这种方法的简单性。

示例如下

实现两数求和的C代码,保存为 add.c

//sample C file to add 2 numbers - int and floats

#include <stdio.h>

int add_int(int, int);
float add_float(float, float);

int add_int(int num1, int num2){
    return num1 + num2;

}

float add_float(float num1, float num2){
    return num1 + num2;

}

接下来将C文件编译为 .so 文件(windows 下为 DLL)。下面操作会生成 adder.so 文件:

现在在你的Python代码中来调用它

输出如下

在这个例子中,C 文件是自解释的,它包含两个函数,分别实现了整形求和和浮点型求和。

在Python文件中,一开始先导入 ctypes 模块,然后使用 CDLL 函数来加载我们创建的库文件。这样我们就可以通过变量 adder 来使用 C 类库中的函数了。当 adder.add_int() 被调用时,内部将发起一个对 C 函数 add_int 的调用。ctypes 接口允许我们在调用 C 函数时使用原生 Python 中默认的字符串型和整型。

而对于其他类似布尔型和浮点型这样的类型,必须要使用正确的 ctype 类型才可以。如向 adder.add_float() 函数传参时, 我们要先将Python中的十进制值转化为 c_float 类型,然后才能传送给 C 函数。这种方法虽然简单,清晰,但是却很受限。例如,并不能在 C 中对对象进行操作。

最后更新于

这有帮助吗?