目標: Boost::Python ライブラリを使用して、C++ コードで Python をインタラクティブに使用しようとしています。私の目標は、Python インタープリターから C++ で定義したクラスの変数を変更することです。
コードは以下に添付されています。
問題: Python インターフェイスでライブラリをロードし (つまり、hello をロード)、そこからオブジェクトを作成できます (obj = hello.World())。変数なしで関数 ( obj.greet() ) にアクセスすることもできますが、変数 (obj.Set("Hello") ) を使用して関数にアクセスしたい場合は、メモリ アクセス違反 ("アクセス違反読み取り位置 0xffffffffffffffff") が発生します。その関数が文字列を取るだけの空の関数であっても。
struct World
{
void set(string _msg) {}
string greet() { return msg; }
string msg;
};
typedef boost::shared_ptr<World> World_ptr;
BOOST_PYTHON_MODULE(hello)
{
bp::class_<World, World_ptr>("World")
.def("greet", &World::greet)
.def("set", &World::set)
;
}
int main(int argc, char **argv)
{
Py_Initialize();
bp::object main = bp::object(bp::handle<>(bp::borrowed(PyImport_AddModule("__main__"))));
bp::object global(main.attr("__dict__"));
inithello();
// Bring up Python interpreter
Py_Main(argc, argv);
Py_Finalize();
return 0;
}
実際、これは Boost::Python チュートリアルから来ており、Python インタープリターを使用するように変更されてい ます http://www.boost.org/doc/libs/1_51_0/libs/python/doc/tutorial/doc/html/python/exposing.html
どうもありがとう
---------------------編集----------------------
多くのテストを行った結果、問題は文字列入力のみにあることがわかりました。つまり、char* や int は問題ありません。ブーストpythonの文字列に問題はありますか?