Python + SWIG
От: lizz Россия http://zetblog.ru
Дата: 13.01.09 13:39
Оценка:
Доброго времени суток! Помогите пожалуйста решить одну (или две проблему.

Вобщем откопал такую штуку, как swig, вроде бы неплохая вещь, но возникли некоторые трудности. Делаю всё, как в туториале на swig.org, ошибок никаких нет, но вот не могу обратиться к объявленой в сишном коде переменной и описаной там структуре. Функции при этом работают нормально.

Файл example.cxx:
/* File : example.c */

typedef struct V {
    double x,y,z;
} v;

int add(int a, int b) {
    return (a + b);
}


example.i:
/* example.i */
%module example
%{
/* Put header files here or function declarations like below */
#define SWIG_FILE_WITH_INIT
extern int add(int a, int b);
extern struct v;
%}

extern struct v;
int add(int a, int b);


swig -c++ -python example.i \
&& g++ -fPIC -c example.cxx \
&& g++ -fPIC -c example_wrap.cxx -I/usr/local/include/python2.5 \
&& g++ -shared example.o example_wrap.o -o _example.so


Получаем:
swig -c++ -python example.i &&  g++ -fPIC -c example.cxx &&  g++ -fPIC -c example_wrap.cxx -I/usr/local/include/python2.5 &&  g++ -shared example.o example_wrap.o -o _example.so
example_wrap.cxx:2601: error: a storage class can only be specified for objects and functions
*** Error code 1


Если убрать "extern" в "extern struct v;" — то питон ругается:
>>> example.v()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'v'


Куда дальше копать — не знаю. Помогите, плиз...
Re: Python + SWIG
От: FR  
Дата: 13.01.09 13:54
Оценка:
Здравствуйте, lizz, Вы писали:

L>Доброго времени суток! Помогите пожалуйста решить одну (или две проблему.


L>Вобщем откопал такую штуку, как swig, вроде бы неплохая вещь, но возникли некоторые трудности. Делаю всё, как в туториале на swig.org, ошибок никаких нет, но вот не могу обратиться к объявленой в сишном коде переменной и описаной там структуре. Функции при этом работают нормально.



Сделай example.h со структурой и включай его в example.i
Re[2]: Python + SWIG
От: lizz Россия http://zetblog.ru
Дата: 13.01.09 18:37
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, lizz, Вы писали:


L>>Доброго времени суток! Помогите пожалуйста решить одну (или две проблему.


L>>Вобщем откопал такую штуку, как swig, вроде бы неплохая вещь, но возникли некоторые трудности. Делаю всё, как в туториале на swig.org, ошибок никаких нет, но вот не могу обратиться к объявленой в сишном коде переменной и описаной там структуре. Функции при этом работают нормально.



FR>Сделай example.h со структурой и включай его в example.i


Можно по подробней... либо я не догоняю чего, либо не работает %).

example.h:
typedef struct V {
    double x, y, z;
} v;
extern int add(int a, int b);


Инклюдю его в example.cxx и example.i:
/* example.i */
%module example
%{
/* Put header files here or function declarations like below */
#define SWIG_FILE_WITH_INIT
#include "example.h"
%}

extern int add(int a, int b);


В таком варианте тоже питон говорит, что нет example.v или example.V. Если добавить к структуре extern — то ругается gcc .
Re[3]: Python + SWIG
От: FR  
Дата: 14.01.09 05:46
Оценка:
Здравствуйте, lizz, Вы писали:

FR>>Сделай example.h со структурой и включай его в example.i


L>Можно по подробней... либо я не догоняю чего, либо не работает %).


добавь еще %include "example.h"
Re[4]: Python + SWIG
От: lizz Россия http://zetblog.ru
Дата: 15.01.09 07:40
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, lizz, Вы писали:


FR>>>Сделай example.h со структурой и включай его в example.i


L>>Можно по подробней... либо я не догоняю чего, либо не работает %).


FR>добавь еще %include "example.h"


Что-то не тоже не то... ну да ладно, нкжда в этом пока отпала, потом по копаюсь для себя, может разбирусь.

Спасибо за помощь.
Re: Python + SWIG
От: lizz Россия http://zetblog.ru
Дата: 22.01.09 21:56
Оценка:
Если кому интересней, решил так:
example.i:
/* example.i */
%module example
%{
/* Put header files here or function declarations like below */
#define SWIG_FILE_WITH_INIT
int add(int a, int b);
struct V {
    double x,y,z;
};
int t = 5;
%}

int t = 5;
struct V {
    double x,y,z;
};
int add(int a, int b) {
    return a + b;
}


Больше стурктура ни в каких файлах не упоминается, add так же прилось описать в example.cxx, так и не понял почему %). Подробней (но не подробно)) описал у себя в блоге, не сочтите за спам, линк в профиле.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.