Как я могу использовать указатели структуры C в Python с помощью Swig? - PullRequest
0 голосов
/ 07 июня 2018

У меня есть указатель на структуру C, и мне нужно знать, как я могу инициализировать структуру из python после генерации библиотеки python с помощью swig.

Мне удалось скомпилировать код и запустить swig без каких-либо ошибок.Я также смог импортировать библиотеку в python.

Моя цель - научиться использовать указатели с c / swig / python.

Это функция c, которую я хочудля интеграции в Python:

#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 выглядитthis

/* 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 голосов
/ 07 июня 2018

Я нашел один способ достичь этого,

сначала напишите функцию, которая инициализирует указатель структуры и возвращает указатель на структуру,

вы вызываете эту функцию со стороны 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);
...