[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