使用ctypes模块在Python代码调用C函数

2018-10-21  本文已影响0人  crazyhank

使用Python语言进行编程的时候可能会需要调用用C语言开发的库,那么如何调用呢,传递给C函数的参数以及返回值如何定义,特别是对于C语言中的指针以及数据结构类型的参数,还好我们有ctypes模块,下面以一个例子来说明:

#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

#-*- 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

上一篇下一篇

猜你喜欢

热点阅读