我有一个指向C结构的指针,我需要知道如何在使用swig生成python库后从python初始化结构。
我能够编译代码并运行swig而没有任何错误,我还能够将库导入python。
我的目标是学习如何使用c / swig / python指针。
这是我想要集成到python中的c函数:
#include <stdio.h>
#include "myswig.h"
myData* myhfun(myData *data){
data->s = data->r1 + data->r2;
printf("sum(%f+%f)=%f\n", data->r1, data->r2, data->s);
return data;
}
这是相同的头文件:
//file myswig.h
struct myData{
double r1;
double r2;
double s;
};
typedef struct myData myData;
myData* myhfun(myData *data);
我的swig界面文件如下所示
/* file: myswig.i */
%module myswig
%{
#include "myswig.h"
%}
/*my function */
myData* myhfun(myData *data);
运行swig和测试的脚本:
swig -python -Isrc myswig.i
gcc -Isrc -fPIC -I/usr/include/python3.5m -I/usr/include/x86_64-linux-gnu/python3.5m -lpython3.5m -c src/myswig.c myswig_wrap.c
gcc -shared -fPIC -o _myswig.so myswig.o myswig_wrap.o
python3 -c "import myswig"
答案 0 :(得分:0)
我找到了一种方法来实现这一目标,
首先编写一个初始化结构指针的函数,并返回指向结构的指针
从python端调用此函数并将指针值存储在变量
中现在你可以传递这个变量,好像它是一个指针:)。
C函数
#include<stdlib.h>
#include "myswig.h"
myDataHolder* initStructMem(){
myDataHolder *myStruct;
myStruct=malloc(sizeof(myStruct));
return myStruct;
}
myDataHolder* setVal(int a ,int b, myDataHolder *data){
data->r1=a;
data->r2=b;
return data;
}
int getSum(myDataHolder *data){
data->s = data->r1 + data->r2;
return 0;
}
void printVal(myDataHolder *data){
printf("sum of %d and %d = %d",data->r1, data->r2, data->s);
}
Python代码
import myswig
x = myswig.initStructMem()
y = myswig.setVal(1,2,x)
myswig.getSum(y)
myswig.printVal(y)
Swig定义文件
/* file: myswig.i */
%module myswig
%{
#include "myswig.h"
%}
/*my func */
myDataHolder* initStructMem(void);
myDataHolder* setVal(int a ,int b, myDataHolder *data);
int getSum(myDataHolder *data);
void printVal(myDataHolder *data);