1

I have a question regarding the below code.

It's an example how to pass a custom class via shared_ptr to embedded python code and it works when boost is dynamically linked.

Unfortunately the same code with statically linked boost doesn't work with the following error message:

"No to_python (by-value) converter found for C++ type: class boost::shared_ptr".

I don't understand why a different linking can affect type recognition of a registered converter. What am I missing?

Can anybody help me out?

Thanks,

Dominik

Example from here.

#include <boost/shared_ptr.hpp> #include <boost/make_shared.hpp> #include <boost/python.hpp> #include <string> #include <iostream> namespace bp = boost::python; struct Foo{ Foo(){} Foo(std::string const& s) : m_string(s){} void doSomething() { std::cout << "Foo:" << m_string << std::endl; } std::string m_string; }; typedef boost::shared_ptr<Foo> foo_ptr; BOOST_PYTHON_MODULE(hello) { bp::class_<Foo, foo_ptr>("Foo") .def("doSomething", &Foo::doSomething) ; }; int main(int argc, char **argv) { Py_Initialize(); try { PyRun_SimpleString( "a_foo = None\n" "\n" "def setup(a_foo_from_cxx):\n" " print 'setup called with', a_foo_from_cxx\n" " global a_foo\n" " a_foo = a_foo_from_cxx\n" "\n" "def run():\n" " a_foo.doSomething()\n" "\n" "print 'main module loaded'\n" ); foo_ptr a_cxx_foo = boost::make_shared<Foo>("c++"); inithello(); bp::object main = bp::object(bp::handle<>(bp::borrowed( PyImport_AddModule("__main__") ))); // pass the reference to a_cxx_foo into python: bp::object setup_func = main.attr("setup"); setup_func(a_cxx_foo); // now run the python 'main' function bp::object run_func = main.attr("run"); run_func(); } catch (bp::error_already_set) { PyErr_Print(); } Py_Finalize(); return 0; } 

1 Answer 1

0

I far as I understand the documentation about Boost Python linkage, it seems that the conversion registry used for automatic conversion of Python object into C++ object is not available when statically linked. I'm facing the same issue and that's a pity it is actually the case. I would have imagined at least the required converter to be bundle but I'm afraid it is not the case for some reason.

Sign up to request clarification or add additional context in comments.

2 Comments

I managed to get it working by placing the python wrapper and interpreter in the same project.
Good to know ! Too sad static linkage is so badly documented...

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.