2

目标:我正在尝试使用 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中的字符串有问题吗?

4

2 回答 2

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();
}

另请参阅如何在程序中启动 python 控制台(以便于调试)?.

编译:

$ c++ main.cpp -o main `python-config --cflags` \
     `python-config --ldflags` -lboost_python

跑:

$ ./main -i
于 2012-08-23T19:06:34.047 回答
1

我发现我犯了一个错误,并将 boost_python 的静态库(.lib 文件)添加到链接器页面中。我不确定它导致了什么,但是在我删除它之后,我发现程序使用的是“boost_python-vc100-mt-1_51.dll”而不是“boost_python-vc100-mt-gd-1_51.dll”。

问题解决了,但是谁能解释一下是什么问题?

非常感谢所有的帮助

于 2012-08-24T22:52:22.810 回答