[C++-sig] How to expose to a python user defined type with to/from_python convertors?

2010-05-16 Thread X Wang
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?

2010-05-25 Thread X Wang

> 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?

2010-06-03 Thread X Wang


--- 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