c++で球面調和関数を使いたかったけれどもライブラリがないからpythonから引っ張ってきた話
実のところあるらしいが、visual studio 2017ではなかったのでpythonのscipy.specialから引っ張ってくることにした。
インタプリタを呼ぶ、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;}