Python与C参数交互---结构体指针作为参数 实例

本文展示了如何使用Python的ctypes模块调用C语言实现高效的数据交互,包括定义结构体、分配内存、传递数据及获取C函数返回值。

在Python中某些时候需要C做效率上的补充. 在实际应用中,需要做部分数据的交互. Python 可以通用 ctypes 模块很好地调用C. 下面演示了 Python 中调用C一个标准函数. 传递一个结构指针入. 得到C中分配内存数据 传递出. 希望对你的Python 学习有所帮助.

1 test.c

#include <stdio.h>
#include <stdlib.h>

typedef struct {
        unsigned char words[10];
} keywords;

typedef struct {
        keywords *kws;
        unsigned int len;
} outStruct;

int test(outStruct *o){
        unsigned int i=4;
        o->kws = (keywords *)malloc(sizeof(unsigned char)*10*i);
        strcpy(o->kws[0].words,"test 1");
        strcpy(o->kws[1].words,"test 2");

        o->len = i;
        return 1;
}




2 编译

gcc-c -fPIC-o test.o test.c
gcc
-shared test.o-o test.so

3 test.py

from ctypesimport *

class keywords(Structure):
_fields_
= [
(
'words', c_char*10),]

class outStruct(Structure):
_fields_
= [
(
'kws', POINTER(keywords)),
(
'len', c_int),]

libc
=CDLL("./test.so")
libc.test.argtypes
= [POINTER(outStruct)]

o
= outStruct()

ret
= libc.test(byref(o))

print o.kws[0].words;
print o.kws[1].words;
print o.len

4 测试结果

b'test 1'
b'test 2'
4

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值