c++で球面調和関数を使いたかったけれどもライブラリがないからpythonから引っ張ってきた話

実のところあるらしいが、visual studio 2017ではなかったのでpythonのscipy.specialから引っ張ってくることにした。

 

c++pythonを使うには、

インタプリタを呼ぶ、pythonのオブジェクトを渡してムニャムニャする、インタプリタを閉じるの3構成である。

一度インタプリタを呼べば勝手にやってくれる。

複数のインタプリタを使う方法はあるのだろうか・・・。

 

windows 10 では python3 をインストールすると、Python.h が //python/include/ あたりにある。

このpathをインクルードのpathに追加する(プロパティページのVC++ディレクトリにある)。

dllも要求されるのでリンカーの全般タブにある追加のライブラリディレクトリに//python/libs/を追加する。

これでreleaseモードなら使える。

CPUのbit数も合わせる必要があるので注意。

 

忘れないようにメモメモです。

 

使うときは下参照。

int main(){int main(){ Py_Initialize();
PyObject * pModule = PyImport_ImportModule("scipy.special"); if (pModule == NULL) { return 0; }
PyObject * pFunc = PyObject_GetAttrString(pModule, "sph_harm");
PyObject * pArgs = PyTuple_New(4); PyObject * pValue0 = PyLong_FromLong(0); PyObject * pValue1 = PyLong_FromLong(0); PyObject * pValue2 = PyLong_FromLong(0); PyObject * pValue3 = PyLong_FromLong(0);
PyTuple_SetItem(pArgs, 0, pValue0); PyTuple_SetItem(pArgs, 1, pValue1); PyTuple_SetItem(pArgs, 2, pValue2); PyTuple_SetItem(pArgs, 3, pValue3);
Py_DecRef(pValue1); Py_DecRef(pValue2); Py_DecRef(pValue2); Py_DecRef(pValue3);

PyObject * pValue = PyObject_CallObject(pFunc, pArgs); double result = PyComplex_RealAsDouble(pValue); std::cout << "result: " << result << std::endl;
Py_DecRef(pModule); Py_DecRef(pFunc); Py_DecRef(pArgs);

Py_Finalize(); return 0;}