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);
}
PyBind11をお勧めします。私はPythonモジュールがC++を呼び出して、よりコストとパフォーマンスの高い操作を実行します。BoostPythonは、サイズの豊富なライブラリです。 PyBind11はヘッダーのみで、STLをサポートしているため、コードを記述せずに基本的なデータ構造を簡単に渡すことができます!基本的なC関数とプリミティブデータ型への呼び出しをラップできる場合は、Cpythonが最適です。
社内でpybind11を使用していますが、これはあなたが説明するもの(PythonからアクセスされるC++モジュール)に似ています。 Boostのすべての要件を取り入れたくありません。pybind11は、C++とPythonの間で通常必要な「接着剤」の多くを処理します。例外の変換のようなことは、多くの場合容易に考えられませんが、pybind11によってうまく処理されます。
さらに、C++内部クラスの周りにラッパーを記述して、pybind11をpybind11にし、内部コアエンジンをC++にすることができるようにします。通常、翻訳はそれほど難しくありません。
Pybind11の個人的な経験は、「簡単なことは簡単で、難しいことはまだ難しい」です。サンプルチュートリアルでカバーされているものはすべてすぐに2番目の性質ですが、明白でないものは通常、適切な方法を見つけるために少し掘り下げる必要があります。
それでも、全体として、非常に推奨されます。ハートビートの新しいプロジェクトにもう一度使用します。