最后,我可以使用[]运算符在python中使用std :: vector。诀窍是在boost C ++包装器中简单提供一个容器来处理内部向量:
#include <boost/python.hpp> #include <vector> class world { std::vector<double> myvec; void add(double n) { this->myvec.push_back(n); } std::vector<double> show() { return this->myvec; } }; BOOST_PYTHON_MODULE(hello) { class_<std::vector<double> >("double_vector") .def(vector_indexing_suite<std::vector<double> >()) ; class_<World>("World") .def("show", &World::show) .def("add", &World::add) ; }
另一个挑战是:如何将python列表转换为std :: vectors?我试图添加一个期望将std :: vector作为参数的c ++类,并添加了相应的包装器代码:
#include <boost/python.hpp> #include <vector> class world { std::vector<double> myvec; void add(double n) { this->myvec.push_back(n); } void massadd(std::vector<double> ns) { // Append ns to this->myvec } std::vector<double> show() { return this->myvec; } }; BOOST_PYTHON_MODULE(hello) { class_<std::vector<double> >("double_vector") .def(vector_indexing_suite<std::vector<double> >()) ; class_<World>("World") .def("show", &World::show) .def("add", &World::add) .def("massadd", &World::massadd) ; }
但是,如果这样做,我将得到以下Boost.Python.ArgumentError:
>>> w.massadd([2.0,3.0]) Traceback (most recent call last): File "<stdin>", line 1, in <module> Boost.Python.ArgumentError: Python argument types in World.massadd(World, list) did not match C++ signature: massadd(World {lvalue}, std::vector<double, std::allocator<double> >)
谁能告诉我如何在c ++函数中访问python列表?
谢谢,丹尼尔
为了使您的C ++方法接受Python列表,您应该使用 boost::python::list
boost::python::list
void massadd(boost::python::list& ns) { for (int i = 0; i < len(ns); ++i) { add(boost::python::extract<double>(ns[i])); } }