интеграция boost :: python и swig

#c #python #swig #boost-python

#c #python #swig #boost-python

Вопрос:

У меня есть два класса, первый называется «Radish», а второй называется «RadishCont». Весь код написан на C и должен использоваться на python.

Radish был открыт для python с помощью SWIG; вместо этого RadishCont был открыт с помощью boost::python.

Мне нужно добавить метод в класс RadishCont с таким синтаксисом:

 Radish* get_radish()
{
    return amp;radish;
}
  

Где «редька» — это экземпляр редьки, содержащийся в RadishCont.

Когда я выполняю код python, я получаю это исключение:

 TypeError: No Python class registered for C   class Radish
  

Итак, мой вопрос: как я могу заставить этот метод работать на python, не переписывая RadishCont с помощью SWIG?

Ответ №1:

Я почти уверен, что вам лучше переписать свой интерфейс SWIG, чтобы включить новую функцию. SWIG использует внутреннюю систему регистрации для классов / функций, которая несовместима с системой boost :: pythons (или, по крайней мере, не из коробки).

Ответ №2:

В конце концов, я это сделал.

Я создал экземпляр класса в своем модуле boost python следующим образом:

 class_<Radish>("Radish");
  

Я создал функцию преобразования, подобную этой:

 static void* radishConvert(PyObject* obj)
{
    char thisStr[] = "this";
    //first we need to get the this attribute from the Python Object
    if (!PyObject_HasAttrString(obj, thisStr))
            return NULL;

    PyObject* thisAttr = PyObject_GetAttrString(obj, thisStr);
    if (thisAttr == NULL)
            return NULL;
    //This Python Object is a SWIG Wrapper and contains our pointer
    void* pointer = ((PySwigObject*)thisAttr)->ptr;
    Py_DECREF(thisAttr);
    return pointer;
}
  

Где PySwigObject — это структура, подобная этой:

 struct PySwigObject 
{
    PyObject_HEAD 
    void * ptr;
    const char * desc;
};
  

Наконец, я зарегистрировал свой конвертер:

 boost::python::converter::registry::insert(amp;radishConvert, type_id<Radish>());
  

Это отлично работает, я могу получать объекты из SWIG и передавать их в boost :: python. Обратный процесс все еще не решен, но для меня этого достаточно.

Это руководство, которое я использовал, чтобы найти решение: http://wiki .python.org/moin/boost.python/HowTo#SWIG_exposed_C.2B-.2B-_object_from_Python

Ответ №3:

Эта ошибка возникает из-за Boost.Python. В таблице типов BP нет записи для Редиса. Без записи у BP нет возможности узнать, что делать. Единственный способ получить запись — это завернуть редьку в ВР.

Я боюсь, что BP и SWIG просто не были созданы для совместной работы, и очень сомневаюсь, что вы заставите их работать так, как вы хотите, без обширного взлома.

Я рекомендую вам переместить всю вашу систему либо в одну библиотеку, либо в другую