目标:我想在我的C++代码中使用Boost :: Python库交互式地使用python。 我的目标是改变我在python解释器中定义的一些类的变量。Boost :: Python和函数与变量
该代码附在下面。
问题:我可以在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;
}
其实这个来自升压:: Python的教程进行一些修改,以使用Python解释器 http://www.boost.org/doc/libs/1_51_0/libs/python/doc/tutorial/doc/html/python/exposing.html
非常感谢
--------------- ------ 编辑 ---------------------
我测试了很多,发现只有字符串输入问题。即char *或int没有问题。 boost python中的字符串有问题吗?
Py_Main()调用看起来可疑的(尽管它可能是无关的崩溃)。如果你删除了PyMain(),'PyRun_SimpleString(“import hello as h; w = h.World(); w.set('abc')\ n”);'产生'访问冲突'。 – jfs
我试过你的建议,并得到错误(有点不同)。关键是当我在set(string msg)中使用字符串并在set函数中设置断点时,msg的值不正确,但如果使用set(char * msg),那么msg就是我从python解释器发送的内容。 - Hesam 6分钟前 – Hesam
你看到什么'void set(string _msg){std :: cerr << _msg <<'\ n'; }'和上面的PyRun_Simple ..调用? – jfs