Python通过C动态链接库调用C语言函数
调用方法
如果觉得Python性能不够,可以使用C、C++或Rust、Golang为按标准C类型。为Python编写扩展。Python通过自带的ctypes模块,可以加载并调用C标准动态链接库(如.ddl 或 .so)中的函数。
常用的操作为:
import ctypes
# 加载动态链接库
lib = ctypes.CDLL("./xxx.so")
# 声明要调用函数的参数类型
lib.xxx.argtypes = [ctypes.xxx, ctypes.xxx, ...]
# 声明要调用函数的返回值类型
lib.xxx.restype = ctypes.xxx
例如,calc.so中有个c语言函数如下
int add_int(int a, int b) {
return a + b;
}
则调用方法为
import ctypes
lib = ctypes.CDLL("./calc.so")
lib.add_int.argtypes=[ctypes.c_int, ctypes.c_int] # 都是c_int参数时可以省略
lib.add_int.restype = ctypes.c_int # 返回c_int时可以省略
print(lib.add_int(3, 5))
实践
- 使用C语言编写被调用函数
calc.c
# include<stdio.h>
int add_int(int a, int b) {
return a + b;
}
float add_float(float a, float b) {
return a + b;
}
char * add_str(const char* a, const char* b, char *c) {
sprintf(c, "%s%s", a, b);
return c;
}
- 使用gcc编译为动态链接库
需要自行安装gcc
gcc -shared calc.c -o calc.so
- 使用Python调用C语言函数
call_c.py
import ctypes
lib = ctypes.CDLL("./calc.so")
print(lib.add_int(3, 5))
lib.add_float.argtypes=[ctypes.c_float, ctypes.c_float]
lib.add_float.restype = ctypes.c_float
print(lib.add_float(3.2, 5.3))
lib.add_str.argtypes=[ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p]
lib.add_str.restype=ctypes.c_char_p
c = lib.add_str(b"Hello", b"World", b'')
print(c)
运行结果如下:
8
8.5
b'HelloWorld'