Pybind11 или Boost.Python или ни то, ни другое

Мне любопытно, какой самый гибкий, самый эффективный и самый простой способ заставить 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);
}

person user2723494    schedule 04.04.2018    source источник
comment
Вы хотите вызывать код Python из C++, вызывать код C++ из Python или и то, и другое?   -  person pschill    schedule 04.04.2018
comment
На этом этапе просто вызовите c++ из Python. Python вызывает c++, c++ выполняет некоторую операцию более эффективно, а затем передает результат обратно в python.   -  person user2723494    schedule 04.04.2018
comment
И pybind11, и boost хорошо справляются с созданием привязок. Тем не менее, вы должны дважды подумать о введении большой зависимости, такой как boost. Если вам нужна библиотека только для привязок Python, используйте pybind11, так как он намного легче. Я также получил хороший опыт работы с библиотекой cython. Основное различие между pybind11 и cython заключается в том, что в pybind11 вы пишете привязки на c++, а в cython вы пишете привязки на языке, похожем на python.   -  person pschill    schedule 04.04.2018


Ответы (2)


Я бы рекомендовал PyBind11. Я использую его для аналогичного случая использования, когда модули Python вызывают C++ для выполнения операций, которые являются более дорогостоящими и производительными. Boost Python — это более богатая библиотека с затратами на размер, поскольку PyBind11 — это только заголовок, и он поддерживает STL, что упрощает передачу базовой структуры данных без написания кода! Если вы можете обернуть свои вызовы базовой функцией C и примитивными типами данных, тогда Cpython будет лучшим!

person ryadav    schedule 01.05.2018

Мы используем внутренний pybind11 для чего-то похожего на то, что вы описываете (доступ к модулю C++ из Python). Я не хочу выполнять все требования Boost, и pybind11 позаботится о большей части «клея», обычно необходимого между C++ и Python. О таких вещах, как преобразование исключений, во многих случаях трудно подумать, но pybind11 прекрасно справляется с ними.

Кроме того, мы пишем оболочки для наших внутренних классов C++, так что pybind11 может быть pybind11, а наш внутренний основной движок может быть C++. Переводы, как правило, не так уж сложны.

Личный опыт работы с pybind11 говорит о том, что «легкие вещи остаются легкими, сложные вещи остаются сложными». Все, что описано в примере учебника, быстро становится второй натурой, но вещи, которые не очевидны, обычно требуют некоторого копания, чтобы найти хороший способ сделать это.

Тем не менее, в целом, очень рекомендуется. Я бы использовал его снова для новых проектов в одно мгновение.

person Joe Marley    schedule 02.05.2018