2017-02-04 7 views
0

나는 C++ 객체를 가지고 있으며 임베디드 파이썬 인터프리터에 대한 참조/포인터로 전달하여 파이썬이 양쪽 모두에 대해 변경할 수 있도록한다. C++ 및 Python. 나는 Boost.Python을 interop 용으로 사용하고 있습니다.Boost.Python을 사용하여 참조/포인터로 파이썬 인터프리터에 전달하기

mymodule.h : 예의를 위해서

, 여기에 클래스 Foo, 그 Boost.Python 래퍼 및 C++에서 Foo 개체입니다

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++과 파이썬 모두가 그 내용을 볼 수 있도록

#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의 참조를 보내려면 어떻게합니까?

C++에서

답변

0

, 스크립트를 실행하기 전에 추가 :

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

을 이제 파이썬 환경이 C++ 변수에 대한 포인터를해야합니다 foo와 파이썬 스크립트하여에 대한 변경이 수행됩니다 C++ 객체가 필요합니다. myscript.py 경우

이다 :

foo.bar = 12 

다음 끝에 cout 라인 출력 12하지 42 것이다.

네임 스페이스 안에 foo을 입력하여 원점을 자체 문서화 할 수 있습니다 (예 : mymodule.foo.bar).

Boost.Python 문서는이 통과 방법을 설명하지는 않지만 그럼에도 불구하고 작동합니다.