美文网首页
使用ctypes模块在Python代码调用C函数

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

作者: crazyhank | 来源:发表于2018-10-21 10:12 被阅读0次

    使用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

    相关文章

      网友评论

          本文标题:使用ctypes模块在Python代码调用C函数

          本文链接:https://www.haomeiwen.com/subject/lqavzftx.html