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

Ron Brown, Jr. rbrown at gamry.com
Wed Apr 18 17:58:49 CEST 2007


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




More information about the Cplusplus-sig mailing list