繁体   English   中英

Boost Python使用std :: vectors作为参数导入C ++函数

[英]Boost Python importing a C++ function with std::vectors as arguments

我正面临一个问题,昨天我发帖询问如何在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 ndarrays或2D列表发送到要转换为2D矢量的函数。 如果我使用2D ndarrays,我将不得不使用numpy Boost。 在我的情况下,我不介意使用其中一个。 但我不明白如何转换为2D矢量。 你能给我一个易于理解的解决方案吗? 真的很感激。

谢谢

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM