【问题标题】:how can I use C struct pointers in python using swig?如何使用 swig 在 python 中使用 C 结构指针?
【发布时间】:2018-06-07 12:05:17
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    我找到了一种方法来实现这一点,

    先写一个函数,初始化一个结构体指针,并返回该结构体的指针,

    你从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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-24
      • 2023-01-19
      • 2017-04-13
      相关资源
      最近更新 更多