Why can't I extract a C++ type from a Python type using boost::python::extractor?

Posted by Robin on Stack Overflow See other posts from Stack Overflow or by Robin
Published on 2012-11-29T22:17:32Z Indexed on 2012/11/30 17:04 UTC
Read the original article Hit count: 187

Filed under:
|
|

I've wrapped a C++ class using Py++ and everything is working great in Python. I can instantiate the c++ class, call methods, etc.

I'm now trying to embed some Python into a C++ application. This is also working fine for the most-part. I can call functions on a Python module, get return values, etc.

The python code I'm calling returns one of the classes that I wrapped:

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

I'm calling this function from C++ like this:

// ... 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();
}

The problem is the extractor never actually extracts/converts the PyObject* to MyClass (i.e. extractor.check() is always false).

According to the docs this is the correct way to extract a wrapped C++ class.

I've tried returning basic data types (ints/floats/dicts) from the Python function and all of them are extracted properly.

Is there something I'm missing? Is there another way to get the data and cast to MyClass?

© Stack Overflow or respective owner

Related posts about c++

Related posts about boost-python