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

use*_*494 9 c++ python 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);
}
Run Code Online (Sandbox Code Playgroud)

rya*_*dav 11

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


小智 6

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

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

pybind11的个人经验是“容易的事情很容易,困难的事情仍然很困难”。示例教程中涉及的所有内容都是第二天的习惯,但是不明显的内容通常需要进行一些挖掘才能找到一种好的方法。

总之,还是非常推荐。我会在心跳中再次将其用于新项目。