boost :: python и swig интеграция - PullRequest
2 голосов
/ 27 октября 2011

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

Редька подверглась воздействию питона с помощью SWIG; RadishCont вместо этого был выставлен с использованием boost :: python.

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

Radish* get_radish()
{
    return &radish;
}

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

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

TypeError: No Python class registered for C++ class Radish

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

Ответы [ 3 ]

2 голосов
/ 27 октября 2011

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

1 голос
/ 04 ноября 2011

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

Я создал экземпляр класса в моем модуле 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(&radishConvert, type_id<Radish>());

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

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

0 голосов
/ 27 октября 2011

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

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

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

...