我想在c ++ app中使用embed python并调用python脚本中定义的函数。函数的参数是一个c ++对象。看我的代码:
class Test
{
public:
void f()
{
std::cout<<"sss"<<std::endl;
}
};
int main()
{
Py_Initialize();
boost::python::object main = boost::python::import("__main__");
boost::python::object global(main.attr("__dict__"));
boost::python::object result = boost::python::exec_file("E:\\python2.py", global, global);
boost::python::object foo = global["foo"];
if(!foo.is_none())
{
boost::python::object pyo(boost::shared_ptr<Test>(new Test())); // compile error
foo(pyo);
}
return 0;
}
python2.py:
def foo(o):
o.f()
如何将c ++对象传递给foo?我知道swig可以做到这一点,但是boost :: python?
答案 0 :(得分:2)
您需要将您的测试类型公开给Python,如下所示:http://wiki.python.org/moin/boost.python/HowTo
答案 1 :(得分:2)
解决。
class Test
{
public:
void f()
{
std::cout<<"sss"<<std::endl;
}
};
//==========add this============
BOOST_PYTHON_MODULE(hello)
{
boost::python::class_<Test>("Test")
.def("f", &Test::f)
;
}
//===============================
int main()
{
Py_Initialize();
//==========add this============
inithello();
//===============================
boost::python::object main = boost::python::import("__main__");
boost::python::object global(main.attr("__dict__"));
boost::python::object result = boost::python::exec_file("E:\\python2.py", global, global);
boost::python::object foo = global["foo"];
if(!foo.is_none())
{
boost::shared_ptr<Test> o(new Test);
foo(boost::python::ptr(o.get()));
}
return 0;
}