Boost Python使用std :: vectors作为参数

时间:2016-10-25 11:09:16

标签: python c++ vector boost

我正面临一个问题,昨天我发帖询问如何在Python中导入C ++功能:Post。在这篇文章中,他们建议我使用Boost Python。所以我开始学习它。但是所有的教程对我来说都很复杂。我知道Python语言,但我学习C ++,所以我发现很难理解。另一点是,在我在这里找到的所有帖子中,他们都谈到了C ++中的1D向量,但我的函数采用了2D向量。

实际上,所有帖子通常都使用C ++类而不是函数。我对C ++中的类一无所知。但是我发现它在我的情况下没用,因为我只想评估一个函数并将结果(double)返回给python。所以第一个问题是。是否需要使用类而不是Boost python的函数?

正如您在其他帖子中看到的,我的功能具有以下结构:

double many_body_pot(
std::vector< std::vector<double> > &par,
std::vector< std::vector<double> > &geometry,
double x, double y, double z)
{
   // ...
}

因此需要2个2D矢量和3个双精度作为参数。所以我到目前为止学到的是我必须在我的C ++脚本中使用#include <boost/python.hpp>,我必须包含这样的内容:

BOOST_PYTHON_MODULE(many_body_pot) {
    using namespace boost::python;
    def("many_body_pot", many_body_pot);
}

Python必须将2D ndarrays或2D列表发送到要转换为2D矢量的函数。如果我使用2D ndarrays,我将不得不使用numpy Boost。在我的情况下,我不介意使用其中一个。但我不明白如何转换为2D矢量。你能给我一个易于理解的解决方案吗?真的很感激。

谢谢

1 个答案:

答案 0 :(得分:0)

对于只懂脚本的人来说,C ++有一个复杂的学习曲线。 C ++拥有比你想象的更多的自由。这种自由可能是新学习者的诅咒。因此,除非你花一些时间来理解C ++是如何工作的,否则你不仅会做错工作,而且你也可能效率低下。

我知道这可能不是您问题的答案,但如果您想避免使用类,请考虑使用toConcurrentMap。您可以创建一个共享库,然后在Python中导入它。

我个人而言,除非必须,否则我会成为添加不必要库的大对手。我认为ctypes提供的自由以及几乎所有Python版本的向后/向前兼容性以及将C ++工作与Python分离的可能性是无价的。因此,考虑使用LenString1 rem LenString2,然后您需要学习的是如何创建函数以及如何将它们编译为共享库。既然你是Python专家,那么将它导入Python并使用它就不会有问题。