#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 просто не были созданы для совместной работы, и очень сомневаюсь, что вы заставите их работать так, как вы хотите, без обширного взлома.
Я рекомендую вам переместить всю вашу систему либо в одну библиотеку, либо в другую