Hi, "Cplusplus-sig" <cplusplus-sig-bounces+holger.joukl=lbbw...@python.org> schrieb am 02.09.2012 17:00:38:
> I have to make a python function as callback of a c++ function.How > to do?Where can I find some examples?? I want to use boost.python. > I want my code look something like this: In C++ : > typedef void (*MyCallback_t) (CallbackInfo); > class MyClass > {... > void setcallback(MyCallback_t cb); > ... > } > > And to use it in python : > import mylib > class mypythonclass: > def myCallback(mylib_CallbackInfo): > .... > def mywork(): > t = mylib.MyClass() > t.setcallback(self.myCallback) A function pointer can not be wrapped in a way so that an arbitrary python function can be used as a (callback) argument. This is due to C/C++ restrictions, see http://www.boost.org/doc/libs/1_51_0/libs/python/doc/v2/faq.html#funcptr Basically, a C/C++ function pointer needs to exist at compile time and doesn't have state while Python functions are stateful objects that come to life at runtime. If you have control over the C++ code you could change the signature to take a boost::python::object as an argument and call that, something like //Instead of actually wrapping these... char const * call(char const * (*func)()) { std::cout << "--> call" << std::endl; return (*func)(); } char const * call_int(char const * (*func)(int), int i) { std::cout << "--> call_int" << std::endl; return (*func)(i); } // ...we expose these *instead* - note that the original call()/call_int() aren't used at all namespace bp = boost::python; char const * call_wrap(bp::object &func) { bp::object result = func(); return bp::extract<char const *>(result); } char const * call_int_wrap(bp::object &func, int i) { bp::object result = func(i); return bp::extract<char const *>(result); } BOOST_PYTHON_MODULE(func_ptr) { bp::def("call", &call_wrap); bp::def("call_int", &call_int_wrap); }; See also http://boost.2283326.n4.nabble.com/Boost-Python-C-struct-with-a-function-pointer-td2699880.html for some hints/discussion. Holger Landesbank Baden-Wuerttemberg Anstalt des oeffentlichen Rechts Hauptsitze: Stuttgart, Karlsruhe, Mannheim, Mainz HRA 12704 Amtsgericht Stuttgart _______________________________________________ Cplusplus-sig mailing list Cplusplus-sig@python.org http://mail.python.org/mailman/listinfo/cplusplus-sig