Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> swig/cygwin/python 
V
    Опции темы
похмелье
  Дата 26.2.2013, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 19.2.2009

Репутация: нет
Всего: 1



Захотелось использовать библиотеку на c++ в любимом питоне. После первой сборки пользовался только функциями и примитивными типами, проблем не было. Потом потребовалось использовать функции, которые принимают в качестве аргумента структуры. Ну, думаю, в документации к swig написано, что тут всё просто. Так и оказалось, создаёшь структуру как любой объект в питоне и готово. Но после запуска оказалось, что именно в момент создания структуры всё "зависает", питон "работает" со 100% загрузкой процессора. Я не отчаялся, подумал что библиотека сложная и надо сделать простой пример, который я хочу обсудить далее.

Итак, я хочу воспользоваться сишной структурой из питона. У меня в наличии:

yoba.h (собственно, описание структуры)
Код

typedef struct{
    int bar;
} foo;


yoba.i (файл для swig, тут всё просто)
Код

%module yoba

%{
#include "yoba.h"
%}

%include "yoba.h"


setup.py (файл для создания модуля при помощи distutils)
Код

from distutils.core import setup, Extension


setup(
    name = "yoba",
    version = "0.00",
    ext_modules = [Extension(
        "_yoba",
        ["yoba.i"],
        swig_opts=["-py3", '-c++', '-module','yoba'],
    )]
)


Собираем модуль командой
Код

python setup.py build_ext --inplace -ccygwin


В консоли это выглядит следующим образом:
Код

D:\pro\py\mod-test>python setup.py build_ext --inplace -ccygwin 
running build_ext
building '_yoba' extension
swigging yoba.i to yoba_wrap.cpp
D:\tools\cygwin\bin\swig.exe -python -py3 -c++ -module yoba -o yoba_wrap.cpp yoba.i
D:\tools\cygwin\bin\gcc.exe -mcygwin -mdll -O -Wall -ID:\tools\python3.2\include -ID:\tools\python3.2\PC -c yoba_wrap.cpp -o
    build\temp.win32-3.2\Release\yoba_wrap.o
writing build\temp.win32-3.2\Release\_yoba.def
D:\tools\cygwin\bin\g++.exe -mcygwin -shared -s build\temp.win32-3.2\Release\yoba_wrap.o build\temp.win32-3.2\Release\_yoba.def 
    -LD:\tools\python3.2\libs -LD:\tools\python3.2\PCbuild -lpython32 -lmsvcr90 -o D:\pro\py\mod-test\_yoba.pyd


Без предупреждений и ошибок, что не может не радовать, создаются yoba_wrap.cpp, yoba.py, _yoba.pyd. При попытке выполнить нехитрый код происходит зависание:
Код

import yoba


yoba.foo()


Я полез в yoba.py и нашёл класс foo():
Код

class foo(_object):
    __swig_setmethods__ = {}
    __setattr__ = lambda self, name, value: _swig_setattr(self, foo, name, value)
    __swig_getmethods__ = {}
    __getattr__ = lambda self, name: _swig_getattr(self, foo, name)
    __repr__ = _swig_repr
    __swig_setmethods__["bar"] = _yoba.foo_bar_set
    __swig_getmethods__["bar"] = _yoba.foo_bar_get
    if _newclass:bar = _swig_property(_yoba.foo_bar_get, _yoba.foo_bar_set)
    def __init__(self): 
        this = _yoba.new_foo()
        try: self.this.append(this)
        except: self.this = this
    __swig_destroy__ = _yoba.delete_foo
    __del__ = lambda self : None;
foo_swigregister = _yoba.foo_swigregister
foo_swigregister(foo)


Зависание происходит, как и следует ожидать, на строке 
Код

        this = _yoba.new_foo()


Делать нечего, ищем new_foo в yoba_wrap.cpp:
Код

SWIGINTERN PyObject *_wrap_new_foo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  foo *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_foo")) SWIG_fail;
  result = (foo *)new foo();
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_foo, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;



Слегка меняя эту функцию с помощью "return NULL" мне удалось выяснить, что зависание происходит на строке:
Код

  result = (foo *)new foo();


Ну, вот собственно и к вопросу я подошёл. Что не так? В yoba_wrap.cpp есть строка #include "yoba.h", она расположена раньше определения функции, да и компилятор не ругал. В общем, прошу помощи, любые идеи приветствуются.
PM   Вверх
похмелье
Дата 26.2.2013, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 19.2.2009

Репутация: нет
Всего: 1



Разобрался, дело во флаге -ccygwin в
Код

python setup.py build_ext --inplace -ccygwin

с флагом -cmingw32 всё работает. Не совсем понятно почему, правда… У cygwin зависимость от cygwin1.dll остаётся, но он в папке лежит, да ругани на недостающую dll, как в этом случае бывает, не наблюдается.

p.s. Только не думайте что я тему создал как только вопрос возник , третий день уже гуглю и вчитываюсь в доки.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0745 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.