[C++-sig] Share C++ Object Extended in Python?

Roman Yakovenko roman.yakovenko at gmail.com
Tue Jun 19 09:42:17 CEST 2007


On 6/19/07, David Brownell <groups at davidbrownell.com> wrote:
> I have an existing C++ definition that resembles the code below, and would
> like to extend the Events interface using Python.  However, I get errors
> in Python when I attempt to create a Python object that is shared between
> Python and C++.
>
>     struct Events
>     {
>         virtual void Foo(char const *tcString) = 0;
>     };
>
>     struct Object
>     {
>         void Init(Events &events) { _pEvents = &events; }
>         void DoFoo() { _pEvents->Foo("Fire foo!"); }
>
>         Events * _pEvents;
>     };
>
> When using the following boost python code generated with Py++ things work
> well in some cases, but not all.
> struct Events_wrapper : Events, bp::wrapper< Events > {
>
>     Events_wrapper()
>         : Events()
>           , bp::wrapper< Events >(){
>           // null constructor
>          }
>
>         virtual void Foo( char const * tcString ){
>             bp::override func_Foo = this->get_override( "Foo" );
>             func_Foo( tcString );
>         }
>     };
>
>     BOOST_PYTHON_MODULE(tester){
>         bp::class_< Events_wrapper, boost::noncopyable >( "Events" )
>             .def(
>                 "Foo"
>                 , bp::pure_virtual( &::Events::Foo )
>                 , ( bp::arg("tcString") ) );
>
>         bp::class_< Object >( "Object" )
>             .def(
>                 "DoFoo"
>                 , &::Object::DoFoo )
>             .def(
>                 "Init"
>                 , &::Object::Init
>                 , ( bp::arg("events") ) );
>     }
>
> This following Python code works fine:
>
>     import tester
>     class Events(tester.Events):
>         def Foo(self s):
>                 print s
>     e = Events()
>     o = tester.Object()
>     o.Init(e)
>     o.DoFoo()
>
> But I get the error...
>
>     Traceback (most recent call last):
>       File "<interactive input>", line 1, in ?
>     ArgumentError: Python argument types in
>       Object.Init(Object, Events)
>     did not match C++ signature:
>       Init(struct Object {lvalue}, struct Events {lvalue} events)
>
> ...with the code:
>
>     import tester
>     class Events(tester.Events):
>         def __init__(self):

Try to add call to tester.Events.__init__. Does it help?

>                 self.i = 0
>         def Foo(self s):
>                 print s
>     e = Events()
>     o = tester.Object()
>     o.Init(e)
>     o.DoFoo()
>
> It appears that I am not doing something right with the binding code, but
> so far I haven't been able to find the right combination of boost::python
> argument decorators to get the job done.  It seems like I could use an auto_ptr
> if I wanted Object to take ownership of the event object, but I want both
> the Python and C++ code to continue to modify the same instance of Event.
>  Is there some way I can do this?

-- 
Roman Yakovenko
C++ Python language binding
http://www.language-binding.net/



More information about the Cplusplus-sig mailing list