Как я могу извлечь обернутый тип C ++ из типа Python, используя boost :: python?

Я обернул класс C ++, используя Py ++, и все отлично работает в Python. Я могу создать экземпляр класса C ++, вызвать методы и т. Д.

Сейчас я пытаюсь встроить немного Python в приложение C ++. Это также работает нормально по большей части. Я могу вызывать функции в модуле Python, получать возвращаемые значения и т. Д.

Код Python, который я вызываю, возвращает один из классов, которые я упаковал:

import _myextension as myext
def run_script(arg):
my_cpp_class = myext.MyClass()
return my_cpp_class

Я вызываю эту функцию из C ++ так:

// ... excluding error checking, ref counting, etc. for brevity ...
PyObject *pModule, *pFunc, *pArgs, *pReturnValue;

Py_Initialize();
pModule = PyImport_Import(PyString_FromString("cpp_interface"));
pFunc = PyObject_GetAttrString(pModule, "run_script");
pArgs = PyTuple_New(1); PyTuple_SetItem(pArgs, 0, PyString_FromString("an arg"));pReturnValue = PyObject_CallObject(pFunc, pArgs);

bp::extract< MyClass& > extractor(pReturnValue); // PROBLEM IS HERE
if (extractor.check()) {                         // This check is always false
MyClass& cls = extractor();
}

Проблема заключается в том, что экстрактор никогда фактически не извлекает / конвертирует PyObject * в MyClass (то есть extractor.check () всегда ложно).

В соответствии с документы это правильный способ извлечь упакованный класс C ++.

Я попытался вернуть базовые типы данных (ints / floats / dicts) из функции Python, и все они извлекаются правильно.

Я что-то упускаю? Есть ли другой способ получить данные и привести к MyClass?

1

Решение

Я нашел ошибку. Я не связывал свои привязки в моем основном исполняемом файле, потому что привязки были скомпилированы в отдельном проекте, который создал только расширение Python.

Я предположил, что при загрузке расширения с помощью pModule = PyImport_Import(PyString_FromString("cpp_interface")); привязки также будут загружены, но это не так.

Чтобы решить эту проблему, я просто добавил файлы, содержащие мои привязки boost :: python (для меня просто wrapper.cpp), в свой основной проект и пересобрал его.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector