python - Boost Python 以 std::vectors 作为参数导入 C++ 函数

标签 python c++ vector boost

我遇到了一个问题,昨天我发了一个帖子询问如何在 Python 中导入 C++ 函数:Post .在这篇文章中,他们建议我使用 Boost Python。所以我开始学习它。然而所有的教程对我来说真的很复杂。我知道 Python 语言,但我正在学习 C++,所以我发现它很难理解。另一点是,在我在这里找到的所有帖子中,他们都在讨论 C++ 中的一维 vector ,但我的函数采用二维 vector 。

事实上,所有的帖子通常都使用 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 vector 和 3 个 double 作为参数。所以到目前为止我学到的是我必须使用 #include <boost/python.hpp>在我的 C++ 脚本中,我必须包含如下内容:

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

I Python 必须将 2D ndarrays 或 2D 列表发送到要转换为 2D vector 的函数。如果我使用 2D ndarrays,我将不得不使用 numpy Boost。就我而言,我不介意使用其中之一。但我不明白如何转换为二维 vector 。你能给我一个易于理解的解决方案吗?将不胜感激。

谢谢

最佳答案

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

我知道这可能不是您问题的直接答案,但如果您想避免使用类,请考虑使用 Python's ctypes .您可以创建共享库,然后将其导入 Python。

就我个人而言,除非万不得已,否则我坚决反对添加不必要的库。而且我认为 ctypes 提供的自由和与几乎所有 Python 版本的向后/向前兼容性以及将 C++ 工作与 Python 分离的可能性是无价的。因此,考虑使用 ctypes,然后您只需学习如何创建函数以及如何将它们编译为共享库。由于您是 Python 专家,因此将其导入 Python 并使用它不会有问题。

关于python - Boost Python 以 std::vectors 作为参数导入 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40238377/

相关文章:

c++ - 如何从多个 vector 中找到不相同的元素?

c++ - C++ 当前日期和时间的自定义格式

c++ - 如何获取 vector 中元素的类型?

c++ - 无法使用 vector::插入 "no instance of overloaded function..."

python - PyGame 做 3d 吗?

c++ - 返回类型而不是对象如何有效,误解了代码片段

c++ - 未在部分特化中使用的模板参数

python - python中的分位数函数是否忽略NaN?

python - 从另一个文件导入一个函数,在哪里导入其他库?

python - 访问 pandas dataframe 的正确方法