[C++-sig] How to expose to a python user defined type with to/from_python convertors?
How do I expose my C++ type to a user defined python type? I think I could use boost python class_<> wrapper to wrap around, but if I want to use to_python/from_python convertors? Say I want to expose my C++ class(CA) to a python type(PA): C++: class CA { public: //ctors, accessors... private: std::string name_; int value_; }; Python: class PA(object): def __init__(self, name, value): self.name=name self.value=value If I use, void initializeConverters() { using namespace boost::python; to_python_converter(); } with struct CA_to_PA { static PyObject* convert(CA const& s) { printf("In C++ -> python converter?\n"); std::string name=s.name(); int value=s.value(); #if 0 static boost::python::object obj; PyObject* obj_ptr=obj.ptr(); PyObject_SetAttrString(obj_ptr, "name", PyString_FromString(name.c_str())); PyObject_SetAttrString(obj_ptr, "value", PyInt_FromLong(value)); return boost::python::incref(obj_ptr); #else return boost::python::incref( //PyInt_FromLong(1999) Py_BuildValue("s", "native string works") //Py_BuildValue("{s:i,s:i}", "abc", 123, "def", 456) ); #endif } }; How do I create a boost::python::object (or PyObject*) with "name" and "value" attributes? I could get creation and return of python native types to work, but can not get user defined types returned to the python side -- always get NoneType returned. boost::python::object C2Py() { printf("Pre assignment\n"); #if 0 boost::python::object obj(new CA("From C++ to python", 987654321)); PyObject* o=obj.ptr(); #else CA a("From C++ to python", 987654321); PyObject *o=CA_to_PA::convert(a); #endif printf("Post assignment\n"); PyObject *tmp=NULL; std::string name="No Name"; int value=-1; tmp=PyObject_GetAttrString(o, "name"); if (tmp!=NULL) name=PyString_AsString(tmp); tmp=PyObject_GetAttrString(o, "value"); if (tmp!=NULL) value=PyInt_AsLong(tmp); printf("(%s, %d)\n", name.c_str(), value); return obj; } $ python Python 2.5.1 (r251:54863, Oct 5 2007, 11:16:46) [GCC 4.1.1 20070105 (Red Hat 4.1.1-53)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import mytypes >>> pa=mytypes.C2Py() ("No Name", -1) >>>type(pa) NoneType Any help is appreciated, thanks! ___ Cplusplus-sig mailing list Cplusplus-sig@python.org http://mail.python.org/mailman/listinfo/cplusplus-sig
Re: [C++-sig] How to expose to a python user defined type with to/from_python convertors?
> How do I expose my C++ type to a user > defined python type? I think I could use boost python > class_<> wrapper to wrap around, but if I want to use > to_python/from_python convertors? > > Say I want to expose my C++ class(CA) to a python > type(PA): > > C++: > class CA > { > public: > //ctors, accessors... > private: > std::string name_; > int value_; > }; > > Python: > class PA(object): > def __init__(self, name, value): > self.name=name > self.value=value > > If I use, > > void initializeConverters() > { > using namespace boost::python; > to_python_converter CA_to_pA>(); > } > > with > > struct CA_to_PA > { > static PyObject* convert(CA const& > s) > { > printf("In C++ -> > python converter?\n"); > > std::string > name=s.name(); > int > value=s.value(); > > #if 0 > static > boost::python::object obj; > PyObject* > obj_ptr=obj.ptr(); > > > PyObject_SetAttrString(obj_ptr, "name", > > PyString_FromString(name.c_str())); > > PyObject_SetAttrString(obj_ptr, "value", > > PyInt_FromLong(value)); > > return > boost::python::incref(obj_ptr); > #else > return > boost::python::incref( > > //PyInt_FromLong(1999) > > Py_BuildValue("s", "native string works") > > //Py_BuildValue("{s:i,s:i}", "abc", 123, "def", 456) > ); > #endif > } > }; > > How do I create a boost::python::object (or PyObject*) with > "name" and "value" attributes? I could get creation and > return of python native types to work, but can not get user > defined types returned to the python side -- always get > NoneType returned. > > boost::python::object C2Py() > { > printf("Pre assignment\n"); > > #if 0 > boost::python::object obj(new CA("From > C++ to python", 987654321)); > PyObject* o=obj.ptr(); > #else > CA a("From C++ to python", 987654321); > PyObject *o=CA_to_PA::convert(a); > #endif > > printf("Post assignment\n"); > > PyObject *tmp=NULL; > > std::string name="No Name"; > int value=-1; > > tmp=PyObject_GetAttrString(o, "name"); > if (tmp!=NULL) > name=PyString_AsString(tmp); > > tmp=PyObject_GetAttrString(o, "value"); > if (tmp!=NULL) value=PyInt_AsLong(tmp); > > printf("(%s, %d)\n", name.c_str(), > value); > > return obj; > } > > $ python > Python 2.5.1 (r251:54863, Oct 5 2007, 11:16:46) > [GCC 4.1.1 20070105 (Red Hat 4.1.1-53)] on linux2 > Type "help", "copyright", "credits" or "license" for more > information. > >>> import mytypes > >>> pa=mytypes.C2Py() > ("No Name", -1) > >>>type(pa) > NoneType > > Any help is appreciated, thanks! > Any comments? Am I asking the right question? Basically I have a simple C++ type and want to extend it to python. However, I haven't figured out a way to do the C++ to python conversion with boost python's to_python/from_python converter scheme. Am I missing something? ___ Cplusplus-sig mailing list Cplusplus-sig@python.org http://mail.python.org/mailman/listinfo/cplusplus-sig
Re: [C++-sig] How to expose to a python user defined type with to/from_python convertors?
--- On Tue, 5/25/10, Michele De Stefano wrote: > From: Michele De Stefano > Subject: Re: [C++-sig] How to expose to a python user defined type with > to/from_python convertors? > To: "Development of Python/C++ integration" > Date: Tuesday, May 25, 2010, 10:52 AM > There's a very good tutorial on > writing from/to python converters. > This tutorial was suggested to me by one of the members of > this > mailing list and I've found it very useful. > > The link is this one: > http://misspent.wordpress.com/2009/09/27/how-to-write-boost-python-converters/ > > After reading this very useful article, I managed to write > my > mds-utils library (the link is at the end of this e-mail) > which you > can download to see how you can write a from/to python > converter. > > Bye. > Michele > It worked! Sorry for the late reply, I was tied up with a few other things... I just tested a bit and everything works now. I miseed the part where you need to import python type definitions into the C++ environment and somehow thought I could just add attributes on the fly. Thanks a lot! ___ Cplusplus-sig mailing list Cplusplus-sig@python.org http://mail.python.org/mailman/listinfo/cplusplus-sig