Boost.Python能将C++的结构体暴露给Python使用。但是在运用Boost.Python时,却遇到一个难题,
1、在C++定义一个新的结构体struct A 2、将此结构体暴露给Python解释器 3、如今在工程中生成结构体A的对象,A a。 4、希望将a传入Python解释器进行运算,运算的函数写在某py文件中。 一直没有办法解决,希望大虾帮助解答。这个问题就是在c++中调用py实现的接口函数。
类似c++代码 struct a { int a ; int b; }; a temp; GetPythonFunc( & temp ); //调用python函数,参数为一定结构体的引用. 这个结构体用boost可以导出给python. 但是这个参数要怎么传递给python代码呢?
最后在python mailist找到答案
-------------------------------------------------- #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; }; 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(int argc, char *argv[]) { Py_Initialize(); world_ptr worldObjectPtr (new World); worldObjectPtr->set("Hello from C++!"); try { inithello(); PyRun_SimpleString("import hello"); object module(handle<>(borrowed(PyImport_AddModule("__main__")))); object dictionary = module.attr("__dict__"); dictionary["pyWorldObjectPtr"] = worldObjectPtr; PyRun_SimpleString("pyWorldObjectPtr.set('Hello from Python!')"); } catch (error_already_set) { PyErr_Print(); } std::cout << "worldObjectPtr->greet(): " << worldObjectPtr->greet() << std::endl; Py_Finalize(); return 0; } -------------------------------------------------- Output: worldObjectPtr->greet(): Hello from Python!