【问题标题】:Pybind11 or Boost.Python or neither-Pybind11 或 Boost.Python 或两者都不是——
【发布时间】:2018-09-14 03:29:13
【问题描述】:

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

【问题讨论】:

  • 你想从 c++ 调用 python 代码,从 python 调用 c++ 代码,还是两者兼而有之?
  • 在这个阶段,只需从 Python 调用 c++。 Python调用c++,c++更高效地执行一些操作,然后将结果传回给python。
  • pybind11 和 boost 在创建绑定方面做得很好。但是,在引入诸如 boost 之类的大依赖时,您需要三思而后行。如果您只需要一个用于 python 绑定的库,请使用 pybind11,因为它更轻量级。我也对 cython 库有很好的体验。 pybind11 和 cython 的主要区别在于,使用 pybind11,您使用 c++ 编写绑定,而在 cython 中,您使用类似于 python 的语言编写绑定。

标签: python c++ pybind11


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 2014-08-28
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多