Pybind11、Boost.Python或两者都不用-

20

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

1
你想从C++调用Python代码,还是从Python调用C++代码,或者两者都需要? - pschill
在这个阶段,仅从Python调用C++。Python调用C++,C++更有效地执行某些操作,然后将结果传回Python。 - user2723494
9
Pybind11和Boost都能够很好地创建绑定。但是,如果您想引入像Boost这样的大型依赖项,则需要三思而行。如果您只需要一个用于Python绑定的库,请选择pybind11,因为它更加轻量级。我也对cython库有很好的经验。 pybind11和cython之间的主要区别在于,使用pybind11您可以使用C++编写绑定,而在cython中,您可以使用类似Python的语言编写绑定。 - pschill
2个回答

22

我会推荐使用PyBind11。我正在将它用于类似的用例,即Python模块调用C++执行消耗更多、性能更高的操作。Boost Python是一个更丰富的库,但尺寸较大,而PyBind11仅有头文件,并支持STL,这使得传递基本数据结构变得更容易,无需编写任何代码!如果您可以封装对基本C函数和原始数据类型的调用,那么Cpython将是最好的选择!


16
我们正在内部使用pybind11处理类似于您描述的事情(从Python访问C++模块)。我不想拉入所有Boost的要求,而pybind11则处理了C++和Python之间通常需要的大部分“胶水”。例如,将异常转换不容易在许多情况下想到,但是pybind11可以很好地处理它们。
另外,我们编写包装器来包装我们的C++内部类,以便pybind11可以是pybind11,而我们的内部核心引擎可以是C++。翻译通常不难。
个人对pybind11的经验是:“简单的东西很容易,艰难的事情仍然很难。”任何在示例教程中涵盖的内容通常很快就会变得习以为常,但是不明显的事情通常需要一些挖掘才能找到一个好的方法。
总的来说,非常推荐。我会毫不犹豫地再次在新项目中使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接