由于python性能问题的原因,在实际项目中往往会在python中去调用c的一些方法,本文将介绍在centos8下面python去调用c的方法。
python调用cc的示例代码如下:
#include
#include
#include
#include
typedef struct
{
int a,b;
}Node;
int add(Node node)
{
return node.a+node.b;
}
void display()
{
puts("Welcome xiaojia blog");
return ;
}
然后将这个c文件编译成动态链接库
gcc -o libpycall.so -shared -fPIC python_call_c.c
# 动态链接库名称需要以lib开头,在这里libpycall.so就是我们编译成的so库
接下来我们就可以在python中去引用c中的这两个方法了
python提供的ctypes库来引用这些方法。
我们可以先看下简单的调用,先只调用display方法,python代码如下:
import ctypes
load = ctypes.cdll.LoadLibrary
obj = load("./libpycall.so")
obj.display();
那么如果我们想传一个结构体参数该怎么办呢?ctypes库也为我们提供了数据类型映射表https://docs.python.org/3/library/ctypes.html#type-conversions
类必须继承自 ctypes.Structure,每个子类必须定义一个_fields_属性,示例代码如下:
import ctypes
from ctypes import *
load = ctypes.cdll.LoadLibrary
obj = load("./libpycall.so")
obj.display();
class Add(Structure):
_fields_ = [
('a', c_int),
('b', c_int)
]
_add = Add(1, 10)
res = obj.add(_add)
print(res)
结果如下图所示: