Pybind11 或 Boost.Python 或两者都不是-

Pybind11 or Boost.Python or neither-

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

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

我们在内部使用 pybind11 来实现类似于您描述的内容(从 Python 访问 C++ 模块)。我不愿意引入 Boost 的所有要求,而 pybind11 负责 C++ 和 Python 之间通常需要的大部分 "glue"。转换异常之类的事情在很多情况下不容易想到,但 pybind11 可以很好地处理。

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

个人使用 pybind11 的经验是 "easy things are easy, hard things are still hard"。示例教程中涵盖的任何内容都很快成为第二天性,但不明显的内容通常需要深入挖掘才能找到好的方法。

总之还是很推荐的。我会很快再次将它用于新项目。