[C++-sig] Calling member function of object created in C++ via embedded Python

Roman Yakovenko roman.yakovenko at gmail.com
Wed Apr 18 19:47:00 CEST 2007


On 4/18/07, Ron Brown, Jr. <rbrown at gamry.com> wrote:
> I'm still having quite a bit of trouble wrapping my mind around this
> problem, and feel like I'm just missing something obvious.  Again, what
> I'm trying to do is have an instance of an object in C++ and call one of
> that particular object's member functions from Python.
>
> In the example below, I create an instance of the "World" class on the
> C++ side.  It's then COPIED into a new object on the Python side.  This
> is not how I want my application to behave.  How can I change this
> example so that Python doesn't create a NEW object and copy it, but
> instead uses the object created by C++?
>
> I read through the documentation on "ptr()", but I'm not really sure how
> to apply that to this problem.
>
> I'm still quite new to both Python and Boost.Python, so please keep that
> in mind.  Thanks again!
>
>
> -Ron
>
> ----------------------------------------
> #include <boost/python.hpp>
> #include <iostream>
> using namespace boost::python;
>
> class World
> {
> public:
>       void set(std::string msg) { this->msg = msg; }
>       std::string greet() { return msg; }
>       std::string msg;
> };
>
> BOOST_PYTHON_MODULE(hello)
> {
>       class_<World>("World")
>           .def("greet", &World::greet)
>           .def("set", &World::set)
>       ;
> }
>
> int main(int argc, char *argv[])
> {
>
>         Py_Initialize();
>
>         World worldObject, worldObject2;
>         worldObject.set("Hello from C++!");
>
>
>         try {
>                 inithello();
>                 PyRun_SimpleString("import hello");
>                 object module(handle<>(borrowed(PyImport_AddModule("__main__"))));
>                 object dictionary = module.attr("__dict__");
>
>                 dictionary["pyWorldObject"] = worldObject;

I think

         dictionary["pyWorldObject"] = boost::python::ptr( &worldObject );

should work.

>
>                 PyRun_SimpleString("pyWorldObject.set('Hello from Python!')");
>
>                 object resultObject = dictionary["pyWorldObject"];
>                 worldObject2 = extract<World>(resultObject);
>
>         } catch (error_already_set) {
>                 PyErr_Print();
>         }
>
>         std::cout << "worldObject.greet(): " << worldObject.greet() << std::endl;
>         std::cout << "worldObject2.greet(): " << worldObject2.greet() << std::endl;
>
>         Py_Finalize();
>
>         return 0;
> }
> ----------------------------------------
> Output:
> worldObject.greet(): Hello from C++!
> worldObject2.greet(): Hello from Python!
> ----------------------------------------
>
> _______________________________________________
> C++-sig mailing list
> C++-sig at python.org
> http://mail.python.org/mailman/listinfo/c++-sig
>


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



More information about the Cplusplus-sig mailing list