2017-02-04 34 views
0

私はC++オブジェクトを持っており、参照/ポインタを組み込みのPythonインタプリタに渡したいので、Pythonがその両方を見ることができるようにC++とPythonです。私はinteropのために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に:C++とPythonの両方が、その内容を見ることができるように

#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++で

答えて

0

、スクリプトを実行する前に、追加します。

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

を今Python環境は、C++の変数へのポインタを持っていますfooとPythonスクリプトによってそれに加えられた変更は、上で実行されますコピーではなくC++オブジェクトです。

myscript.pyの場合は、次のとおりです。

foo.bar = 12 

そして最後にcoutラインの出力は12、ない42になります。

mymodule名前空間内にfooを配置して、その起源を自己文書化することができます。つまり、mymodule.foo.barです。

Boost.Pythonのドキュメントでは、このバイパスポインタのメソッドは説明されていませんが、それでも動作します。

関連する問題