2017-02-04 92 views
0

我有一个C++对象,并希望通过引用/指针将它传递给嵌入式Python解释器,以便Python可以对其进行更改, C++和Python。我使用Boost.Python进行互操作。通过引用传递一个C++对象/使用Boost.Python传递给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;     
} 

那我怎么送foo参考到Python这样既C++和Python可以看到它的内容是什么?

回答

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文档似乎没有描述这种传递指针的方法,但它仍然有效。