web-dev-qa-db-ja.com

Pybind11またはBoost.Pythonまたはどちらでもない-

C++と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);
}
11
user2723494

PyBind11をお勧めします。私はPythonモジュールがC++を呼び出して、よりコストとパフォーマンスの高い操作を実行します。BoostPythonは、サイズの豊富なライブラリです。 PyBind11はヘッダーのみで、STLをサポートしているため、コードを記述せずに基本的なデータ構造を簡単に渡すことができます!基本的なC関数とプリミティブデータ型への呼び出しをラップできる場合は、Cpythonが最適です。

10
ryadav

社内でpybind11を使用していますが、これはあなたが説明するもの(PythonからアクセスされるC++モジュール)に似ています。 Boostのすべての要件を取り入れたくありません。pybind11は、C++とPythonの間で通常必要な「接着剤」の多くを処理します。例外の変換のようなことは、多くの場合容易に考えられませんが、pybind11によってうまく処理されます。

さらに、C++内部クラスの周りにラッパーを記述して、pybind11をpybind11にし、内部コアエンジンをC++にすることができるようにします。通常、翻訳はそれほど難しくありません。

Pybind11の個人的な経験は、「​​簡単なことは簡単で、難しいことはまだ難しい」です。サンプルチュートリアルでカバーされているものはすべてすぐに2番目の性質ですが、明白でないものは通常、適切な方法を見つけるために少し掘り下げる必要があります。

それでも、全体として、非常に推奨されます。ハートビートの新しいプロジェクトにもう一度使用します。

5
Joe Marley