Thread: [pygccxml-development] Exposing boost::python::list
Brought to you by:
mbaas,
roman_yakovenko
From: Scott S. <sc...@bi...> - 2011-08-01 20:15:15
|
Hi, I'd like to have a class which as a boost::python::list as a public attribute. I know that gccxml cannot parse boost/python.hpp, so given a suggestion on the mailing list archives, I have done the following: #pragma once #ifndef __GCCXML__ #include <boost/python.hpp> typedef boost::python::list list; #else class list; #endif class MyClass { public: list * mylist; }; MyClass::MyClass() { mylist = new boost::python::list(); mylist.append(1); } MyClass::~MyClass() { delete mylist; } Py++ is able to create the bindings and it compiles fine. However, when accessing the 'mylist' attribute in python, I'm seeing the following behavior: >>> print type(myclass.mylist) >>> print type(myclass.mylist) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot create weak reference to 'list' object >>> print type(myclass.mylist) Fatal Python error: GC object already tracked Aborted I think I'm going about this the wrong way, but am unsure of the proper way. Would this be a use case for the 'inserting_code' functionality of py++? Thank you! Scott |
From: Scott S. <sc...@bi...> - 2011-08-02 20:32:04
|
As a follow on, I did get this to work by using an actual list, and not a pointer to one. So the pseudocode becomes: #pramga once #ifndef __GCCXML__ #include <boost/python.hpp> typedef boost::python::list list; #else class list {}; #endif class MyClass { public list mylist; MyClass() { mylist.append(1); } }; Then in python, I have no problems: >>> mc.mylist [1] >>> mc.append(2) >>> mc.mylist [1,2] Thanks, Scott On Mon, 1 Aug 2011, Scott Sturdivant wrote: > Hi, > > I'd like to have a class which as a boost::python::list as a public > attribute. I know that gccxml cannot parse boost/python.hpp, so given a > suggestion on the mailing list archives, I have done the following: > > #pragma once > #ifndef __GCCXML__ > #include <boost/python.hpp> > typedef boost::python::list list; > #else > class list; > #endif > > class MyClass { > public: > list * mylist; > }; > > MyClass::MyClass() > { > mylist = new boost::python::list(); > mylist.append(1); > } > MyClass::~MyClass() > { > delete mylist; > } > > Py++ is able to create the bindings and it compiles fine. However, when > accessing the 'mylist' attribute in python, I'm seeing the following > behavior: > >>>> print type(myclass.mylist) > >>>> print type(myclass.mylist) > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > TypeError: cannot create weak reference to 'list' object >>>> print type(myclass.mylist) > Fatal Python error: GC object already tracked > Aborted > > I think I'm going about this the wrong way, but am unsure of the proper way. > Would this be a use case for the 'inserting_code' functionality of py++? > > Thank you! > > Scott > |
From: Roman Y. <rom...@gm...> - 2011-08-04 15:23:34
|
Thank you for problem & solution contribution :-) On Tue, Aug 2, 2011 at 11:31 PM, Scott Sturdivant <sc...@bi...> wrote: > As a follow on, I did get this to work by using an actual list, and not a > pointer to one. So the pseudocode becomes: > > #pramga once > #ifndef __GCCXML__ > #include <boost/python.hpp> > typedef boost::python::list list; > #else > class list {}; > #endif > > class MyClass { > public list mylist; > MyClass() { mylist.append(1); } > }; > > Then in python, I have no problems: > >>>> mc.mylist > [1] >>>> mc.append(2) >>>> mc.mylist > [1,2] > > Thanks, > > Scott > > > On Mon, 1 Aug 2011, Scott Sturdivant wrote: > >> Hi, >> >> I'd like to have a class which as a boost::python::list as a public >> attribute. I know that gccxml cannot parse boost/python.hpp, so given a >> suggestion on the mailing list archives, I have done the following: >> >> #pragma once >> #ifndef __GCCXML__ >> #include <boost/python.hpp> >> typedef boost::python::list list; >> #else >> class list; >> #endif >> >> class MyClass { >> public: >> list * mylist; >> }; >> >> MyClass::MyClass() >> { >> mylist = new boost::python::list(); >> mylist.append(1); >> } >> MyClass::~MyClass() >> { >> delete mylist; >> } >> >> Py++ is able to create the bindings and it compiles fine. However, when >> accessing the 'mylist' attribute in python, I'm seeing the following >> behavior: >> >>>>> print type(myclass.mylist) >> >>>>> print type(myclass.mylist) >> Traceback (most recent call last): >> File "<stdin>", line 1, in <module> >> TypeError: cannot create weak reference to 'list' object >>>>> print type(myclass.mylist) >> Fatal Python error: GC object already tracked >> Aborted >> >> I think I'm going about this the wrong way, but am unsure of the proper way. >> Would this be a use case for the 'inserting_code' functionality of py++? >> >> Thank you! >> >> Scott >> > > ------------------------------------------------------------------------------ > BlackBerry® DevCon Americas, Oct. 18-20, San Francisco, CA > The must-attend event for mobile developers. Connect with experts. > Get tools for creating Super Apps. See the latest technologies. > Sessions, hands-on labs, demos & much more. Register early & save! > http://p.sf.net/sfu/rim-blackberry-1 > _______________________________________________ > pygccxml-development mailing list > pyg...@li... > https://lists.sourceforge.net/lists/listinfo/pygccxml-development > |