2017-02-04 89 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文檔似乎沒有描述這種傳遞指針的方法,但它仍然有效。