15

我很好奇让 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);
}
4

2 回答 2

18

我会推荐 PyBind11。我将它用于类似的用例,其中 Python 模块调用 C++ 来执行成本更高且性能广泛的操作。Boost Python 是一个更丰富的库,具有大小成本,其中 PyBind11 仅是标头,它支持 STL,这使得无需编写任何代码即可更轻松地传递基本数据结构!如果您可以包装对基本 C 函数和原始数据类型的调用,那么 Cpython 将是最好的!

于 2018-05-01T08:57:55.867 回答
12

我们在内部使用 pybind11 来完成与您所描述的类似的事情(从 Python 访问 C++ 模块)。我不愿意满足 Boost 的所有要求,而 pybind11 负责 C++ 和 Python 之间通常需要的大部分“胶水”。在许多情况下,转换异常之类的事情并不容易想到,但 pybind11 可以很好地处理。

此外,我们围绕 C++ 内部类编写包装器,以便 pybind11 可以是 pybind11,而我们的内部核心引擎可以是 C++。翻译通常并不难。

个人对pybind11的体验是“易事易,难事仍难”。示例教程中涵盖的任何内容都很快成为第二天性,但不明显的事情通常需要一些挖掘才能找到一个好的方法。

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

于 2018-05-02T00:05:37.693 回答