2017-02-10 2 views
2

Предположим, у меня есть класс Python, как так:Как создать и использовать экземпляр объекта Python с повышением :: питона

class MyPythonClass: 
    def Func1(self, param): 
     return 
    def Func2(self, strParam): 
     return strParam 

Если я хочу, чтобы вставить скрипт на Python, который содержит этот класс в моей C++ кода , создайте экземпляр этого объекта через мой код на C++, а затем вызовите элемент на этом объекте python, как мне это сделать?

Я думаю, что это было бы что-то вроде этого:

namespace python = boost::python; 
python::object main = python::import("main"); 
python::object mainNamespace = main.attr("__dict__"); 
python::object script = python::exec_file(path_to_my_script, mainNamespace); 
python::object foo = mainNamespace.attr("MyPythonClass")(); 
python::str func2return = foo.attr("Func2")("hola"); 
assert(func2return == "hola"); 

Но многие вариации этого кода я попытался не работал. Какой волшебный соус мне нужно налить на мой код, чтобы это сделать?

ответ

0

Это то, что в конечном итоге сработало для меня.

namespace python = boost::python; 
python::object main = python::import("main"); 
python::object mainNamespace = main.attr("__dict__"); 

//add the contents of the script to the global namespace 
python::object script = python::exec_file(path_to_my_script, mainNamespace); 

//add an instance of the object to the global namespace 
python::exec("foo = MyPythonClass()", mainNamespace); 
//create boost::python::object that refers to the created object 
python::object foo = main.attr("foo"); 

//call Func2 on the python::object via attr 
//then extract the result into a const char* and assign it to a std::string 
//the last bit could be done on multiple lines with more intermediate variables if desired 
const std::string func2return = python::extract<const char*>(foo.attr("Func2")("hola")); 
assert(func2return == "hola"); 

Не стесняйтесь комментировать, если есть лучший способ.

Смежные вопросы