Я обернул класс 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?
Я нашел ошибку. Я не связывал свои привязки в моем основном исполняемом файле, потому что привязки были скомпилированы в отдельном проекте, который создал только расширение Python.
Я предположил, что при загрузке расширения с помощью pModule = PyImport_Import(PyString_FromString("cpp_interface"));
привязки также будут загружены, но это не так.
Чтобы решить эту проблему, я просто добавил файлы, содержащие мои привязки boost :: python (для меня просто wrapper.cpp), в свой основной проект и пересобрал его.
Других решений пока нет …