使用Python语言进行编程的时候可能会需要调用用C语言开发的库,那么如何调用呢,传递给C函数的参数以及返回值如何定义,特别是对于C语言中的指针以及数据结构类型的参数,还好我们有ctypes模块,下面以一个例子来说明:
- 编写一个C库
#include <stdio.h>
#include <stdlib.h>
struct result_t {
int a;
char *p;
};
struct result_t * get_result(int a, char *p)
{
struct result_t *ret = NULL;
ret = (struct result_t *)malloc(sizeof(struct result_t));
ret->a = a;
ret->p = p;
printf("ret->a = %d, ret->p = %s\n", ret->a, ret->p);
return ret;
}
在这里定义了一个函数,它的入参包含了一个整型和一个字符型指针,返回值则是一个数据结构指针,对其编译成一个库,如下:
$ gcc -fPIC -shared -o libfoo.so foo.c
- Python代码中调用
#-*- coding=utf-8 -*-
from ctypes import *
class RESULT(Structure):
_fields_ = [("a", c_int),
("p", c_char_p)]
lib = CDLL("./libfoo.so", RTLD_GLOBAL)
get_result = lib.get_result
get_result.argtypes = [c_int, c_char_p]
get_result.restype = POINTER(RESULT)
a = 10
my_str = "Hello"
ret = get_result(a, my_str)
print "ret.a = %d, ret.p = %s" % (ret[0].a, ret[0].p)
在这里定义了从Structure继承过来的类,对应C函数中的数据结构。
测试结果如下:
$ python ./test.py
ret->a = 10, ret->p = Hello
ret.a = 10, ret.p = Hello