如何使用swig在python中使用C struct指针?

时间:2018-06-07 12:05:17

标签: c python-3.x swig swig-template

我有一个指向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"

1 个答案:

答案 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);