Pybind11或Boost.Python或两者都没有 -

时间:2018-04-04 14:07:43

标签: python c++ pybind11

我很好奇最灵活,最有效,最无缝的方法是让C ++和Python相互通信。 竞争者似乎是Pybind11,Boost.Python,两者都没有(只需编写函数和包装器如下)。

using namespace boost::algorithm;
static PyObject* strtest(PyObject* self, PyObject* args)
{
    std::string s = "Boost C++ Libraries";
    to_upper(s);
    PyObject * python_val = Py_BuildValue("s", s.c_str());
    return python_val;
}


PyMODINIT_FUNC initmath_demo(void)
{
    static PyMethodDef methods[] = {
        "Test boost libraries" },
        { NULL, NULL, 0, NULL }

    };

    PyObject *m = Py_InitModule("math_demo", methods);
}

2 个答案:

答案 0 :(得分:7)

我会推荐PyBind11。我将它用于类似的用例,其中Python模块调用C ++来执行更昂贵且性能更广泛的操作。 Boost Python是一个更加丰富的库,其大小成本,因为PyBind11只是标题,它支持STL,这使得生活更容易传递基本数据结构而无需编写任何代码!如果你可以将你的调用包装到基本的C函数和原始数据类型,那么Cpython将是最好的!

答案 1 :(得分:3)

我们在内部使用pybind11用于类似于你描述的东西(从Python访问C ++模块)。我不愿意满足Boost的所有要求,而pybind11负责处理大部分的"胶水"通常在C ++和Python之间是必需的。在许多情况下,很难想象转换异常的事情,但pybind11可以很好地处理。

此外,我们在C ++内部类中编写包装器,因此pybind11可以是pybind11,而我们的内部核心引擎可以是C ++。翻译通常不那么难。

使用pybind11的个人经验是:#容易的东西很容易,困难的东西仍然很难"。示例教程中涵盖的任何内容都是第二天性的,但不明显的事情通常需要一些挖掘来找到一个好的方法。

总而言之,非常推荐。我会再次将它用于心跳中的新项目。