を使用して、アプリケーションに Python スクリプト機能を追加しようとしていますboost.python
。私がやりたいことは、Python を使用して、C++ アプリケーションに割り当てられた特定の C++ クラス インスタンスで単純な式を評価することです。
C++ で単純なクラスの Python ラッパーを作成しました。
class pyTest1
{
public:
pyTest1():i(1),f(3.14){}
int getint() { return i; }
void setint(int val) { i = val; }
float getfloat() { return f; }
void setfloat(float val) { f = val; }
private:
int i;
float f;
};
BOOST_PYTHON_MODULE(pyTestSpace)
{
class_<pyTest1>("pyTest1", init<>())
.def("getint", &pyTest1::getint)
.def("setint", &pyTest1::setint)
.def("getfloat", &pyTest1::getfloat)
.def("setfloat", &pyTest1::setfloat)
;
}
のインスタンスが与えられた場合pyTest1
:
pyTest1 *testInstance = new pyTest1;
埋め込み Python を使用して、次のような式を評価したいと思います。
result = math.cos(testInstance->getfloat())
クラス インスタンスと式 (文字列として) が次のように C++ 関数に渡されると仮定します。
#include <string>
#include <boost/python.hpp>
#include <graminit.h>
void UseEmbedPython(std::string exp, pyTest1* obj)
{
Py_Initialize();
initpyTestSpace();
PyObject *pDictionary = PyDict_New();
PyDict_SetItemString(pDictionary, "__builtins__", PyEval_GetBuiltins() );
PyRun_String("import math", file_input, pDictionary, pDictionary );
//Need help here!
//Assuming exp is something like "result = math.cos(obj->getfloat())"
//How do I make obj's functions accessible to Python interpretter?
PyRun_String(exp.c_str(), file_input, pDictionary, pDictionary );
PyObject *pResult = PyDict_GetItemString(pDictionary, "result" );
double result;
PyArg_Parse(pResult, "d", &result );
Py_Finalize();
}