使用Boost.Python

时间:2017-02-04 01:06:50

标签: python c++ boost boost-python

我有一个C ++对象,希望通过引用/指针将它传递给嵌入式Python解释器,以便Python可以对它进行更改,这对C ++和Python都是可见的。我正在使用Boost.Python进行互操作。

为了举例,这里有一个类Foo,它的Boost.Python包装器和一个C ++中的Foo对象:

mymodule.h

struct Foo
{
    int bar;

    Foo(int num): bar(num) {}
};

mymodule.cpp

#include "mymodule.h"
#include <boost/python.hpp>

BOOST_PYTHON_MODULE(mymodule)
{
    using namespace boost::python;

    class_<Foo>("Foo", init<int>())
        .def_readwrite("bar", &Foo::bar)
    ;
}

的main.cpp

#include <iostream>
#include <boost/python.hpp>
#include "mymodule.h"

using namespace boost::python;

int main()
{
    Py_Initialize();

    object main_module = import("__main__");
    object main_namespace = main_module.attr("__dict__");
    import("mymodule");

    Foo foo(42);

    // ... somehow use Boost.Python to send reference to interpreter ... 

    object result = exec_file("myscript.py", main_namespace);

    std::cout << foo.bar << std::endl;                
}

那么我如何向Python发送foo的引用,以便C ++和Python都能看到它的内容?

1 个答案:

答案 0 :(得分:0)

在C ++中,在运行脚本之前,添加:

main_namespace["foo"] = ptr(&foo);

现在Python环境将有一个指向C ++变量foo的指针,Python脚本对它进行的任何更改都将在C ++对象而不是副本上执行。

如果myscript.py是:

foo.bar = 12

然后,cout行的输出将为12,而不是42

请注意,您可能希望将foo置于mymodule命名空间内以自行记录其来源,即mymodule.foo.bar

Boost.Python文档似乎没有描述这种传递指针的方法,但它仍然可以工作。