我遇到了一个问题,昨天我发了一个帖子询问如何在 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/