[英]Boost-python How to pass a c++ class instance to a python class
I am new to boost python. 我是新手来提升python。 I have to first init a cpp class instance in cpp code, and then pass this cpp instance to python code, use a python class instance to invoke it(the cpp instance). 我必须首先在cpp代码中初始化一个cpp类实例,然后将这个cpp实例传递给python代码,使用python类实例来调用它(cpp实例)。 I have tried the Python/C API way, but failed, so I wonder how to pass a c++ class instance to a python class. 我已经尝试过Python / C API方法但是失败了,所以我想知道如何将c ++类实例传递给python类。
The following is my code, changed from the boost python demo. 以下是我的代码,改进了boost python演示。
in main.cpp 在main.cpp中
#include <python2.6/Python.h>
#include <boost/python.hpp>
#include <iostream>
using namespace boost::python;
using namespace std;
class World
{
private:
string name;
public:
void set(string name)
{
this->name = name;
}
void greet()
{
cout << "hello, I am " << name << endl;
}
};
typedef boost::shared_ptr< World > world_ptr;
BOOST_PYTHON_MODULE(hello)
{
class_<World>("World")
.def("greet", &World::greet)
.def("set", &World::set)
;
register_ptr_to_python<world_ptr>();
};
int main()
{
Py_Initialize();
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
world_ptr worldObjectPtr (new World);
worldObjectPtr->set("C++!");
try
{
inithello();
PyObject* pModule =PyImport_ImportModule("python");
PyObject* pDict = PyModule_GetDict(pModule);
PyObject* pClassHelloPython = PyDict_GetItemString(pDict, "Person");
PyObject* pInstanceHelloPython = PyInstance_New(pClassHelloPython, NULL, NULL);
PyObject_CallMethod(pInstanceHelloPython, "sayHi", NULL);
worldObjectPtr->greet();
PyObject_CallMethod(pInstanceHelloPython, "greetReset", "O", worldObjectPtr);
worldObjectPtr->greet();
}
catch (error_already_set)
{
PyErr_Print();
}
Py_Finalize();
return 0;
}
in python.py 在python.py中
class Person:
def sayHi(self):
print 'hello from python'
def greetReset(self, instance):
instance.set('Python')
In the above code, I want to pass the worldObjectPtr to the pInstanceHelloPython, thus, pInstanceHelloPython can set the worldObjectPtr->name to Python. 在上面的代码中,我想将worldObjectPtr传递给pInstanceHelloPython,因此,pInstanceHelloPython可以将worldObjectPtr-> name设置为Python。 But I just don't know how to do it. 但我只是不知道该怎么做。 Thank you for your patience in advance!! 感谢您的耐心等待!!
Pass the object pointer via boost::python::ptr to python. 通过boost :: python :: ptr将对象指针传递给python。 This will prevent the python interpreter from makeing a copy: 这将阻止python解释器制作副本:
#include <boost/python.hpp>
#include <string>
#include <iostream>
using namespace boost::python;
using namespace std;
class World
{
private:
string name;
public:
void set(string name) {
this->name = name;
}
void greet() {
cout << "hello, I am " << name << endl;
}
};
typedef boost::shared_ptr< World > world_ptr;
BOOST_PYTHON_MODULE(hello)
{
class_<World>("World")
.def("greet", &World::greet)
.def("set", &World::set)
;
};
int main(int argc, char **argv)
{
Py_Initialize();
try {
PyRun_SimpleString(
"class Person:\n"
" def sayHi(self):\n"
" print 'hello from python'\n"
" def greetReset(self, instance):\n"
" instance.set('Python')\n"
);
world_ptr worldObjectPtr (new World);
worldObjectPtr->set("C++!");
inithello();
object o_main
= object(handle<>(borrowed(PyImport_AddModule("__main__"))));
object o_person_type = o_main.attr("Person");
object o_person = o_person_type();
object o_func1 = o_person.attr("sayHi");
o_func1();
object o_func2 = o_person.attr("greetReset");
o_func2(boost::python::ptr(worldObjectPtr.get()));
worldObjectPtr->greet();
}
catch (error_already_set) {
PyErr_Print();
}
Py_Finalize();
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.