boost::python:Python 列表到 std::vector
最后我可以使用 [] 运算符在 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> >)
谁能告诉我如何访问其中的 python 列表我的 C++ 函数?
谢谢, 丹尼尔
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
要使您的 C++ 方法接受 Python 列表,您应该使用
boost::python::list
To make your C++ method accept Python lists you should use
boost::python::list
这是我使用的:
如果您发现输入类型(py::object)过于自由,请随意指定更严格的类型(在您的情况下为 py::list )。
Here's what I use:
Should you find the input type (py::object) too liberal, feel free to specify stricter types (py::list in your case).
基于上面的答案,我创建了一个在 C++ 中访问 python 列表以及从 C++ 函数返回 python 列表的示例:
有关构建示例和测试 python 脚本,请查看 这里
谢谢 Arlaharen & rdesgroppes 为指针(不是双关语)。
Based on the above answers I created an example of accessing python lists in C++ as well as returning a python list from a C++ function:
For a build example and a test python script take a look here
Thank you Arlaharen & rdesgroppes for the pointers (pun not intended).
为了从Python列表中获得自动转换,你必须定义一个转换器,它
我现在找不到除了我的代码之外的任何东西,您可以复制并粘贴 此模板(它专门位于该文件的末尾,用于各种包含的类型)。
To get automatic conversion from python lists, you have to define a converter, which
I can't find now anything else than my code, you can copy&paste this template (it is specialized at the end of that file for various contained types).