通过boost :: python将C ++对象传递给python函数

时间:2012-01-30 10:02:55

标签: c++ boost-python

我想在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?

2 个答案:

答案 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;
}

another topic