目标:我正在尝试使用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没问题。 boost python中的字符串有问题吗?
答案 0 :(得分:1)
/**
$ sudo apt-get install libboost-python-dev
$ ./do
*/
#include <boost/python.hpp>
struct World
{
void set(std::string msg) { this->msg = msg; }
std::string greet() { return msg; }
std::string msg;
};
namespace py = boost::python;
BOOST_PYTHON_MODULE(hello)
{
py::class_<World>("World")
.def("greet", &World::greet)
.def("set", &World::set)
;
}
int main(int argc, char* argv[]) {
Py_Initialize();
inithello();
PySys_SetArgv(argc, argv); // use later in Python
if (PyRun_SimpleString("import hello\n"
"planet = hello.World()\n"
"planet.set('howdy')\n"
"print(planet.greet())\n"
// start interactive Python shell if `-i`
"import sys\n"
"if '-i' in sys.argv:\n"
" import code\n"
" code.interact()\n" //NOTE: namespace may be provided
) < 0)
return 1; // an exception is raised in Python
Py_Finalize();
}
另见How can I start the python console within a program (for easy debugging)?。
编译:
$ c++ main.cpp -o main `python-config --cflags` \
`python-config --ldflags` -lboost_python
执行命令
$ ./main -i
答案 1 :(得分:1)
我发现我犯了一个错误,并将boost_python(.lib文件)的静态库添加到链接器页面中。我不确定它是什么导致但是在我删除之后我发现该程序使用“boost_python-vc100-mt-gd-1_51.dll”而不是“boost_python-vc100-mt-1_51.dll”。
问题已经解决,但有人可以解释问题是什么吗?
非常感谢所有帮助