2017-02-04 21 views
0

У меня есть объект C++ и я хочу передать его по ссылке/указателю на встроенный интерпретатор Python, чтобы Python мог вносить в него изменения, которые видны для обоих C++ и Python. Я использую Boost.Python для взаимодействия.Передайте объект C++ по ссылке/указателю на интерпретатор Python с использованием Boost.Python

Ради примера, вот это класс Foo, его Boost.Python обертка и Foo объект в C++:

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, похоже, не описывает этот метод pass-by-pointer, но тем не менее работает.