2012-04-05 3 views
1

Я пытаюсь реорганизовать части моего проекта, особенно интерфейс Python/C++. Стандартный подталкивание :: инициализации питон питон работал раньше:Boost :: Python Forward Объявление boost :: python :: object throwing python TypeError

boost::python::object main_module = boost::python::import("__main__"); 
boost::python::object globals(main_module.attr("__dict__")); 

// ...

Однако, после того, как факторинг, что в своем классе, я получаю

TypeError: No to_python (by-value) converter found for C++ type: boost::python::api::proxy<boost::python::api::attribute_policies> 

Когда инстанцировании объект PyInterface, как показано ниже:

namespace py = boost::python; 
class PyInterface 
{ 
private: 
    py::object 
     main_module, 
     global, 
     tmp; 
    //... 
public: 
    PyInterface(); 
    //... 
}; 

PyInterface::PyInterface() 
{ 
    std::cout << "Initializing..." << std::endl; 
    Py_Initialize(); 
    std::cout << "Accessing main module..." << std::endl; 
    main_module = py::import("__main__"); 
    std::cout << "Retrieve global namespace..." << std::endl; 
    global(main_module.attr("__dict__")); 
    //... 
} 

//in test.cpp 
int main() 
{ 
    PyInterface python; 
    //... 
} 

Running gives the following output: 
Initializing... 
Accessing main module... 
Retrieving global namespace... 

TypeError: No to_python (by-value) converter found for C++ type: boost::python::api::proxy<boost::python::api::attribute_policies> 

Единственное Я могу думать, что это как-то связано с объявлением «глобалов» перед его использованием. В таком случае, есть ли другой способ, которым я могу это сделать?

ответ

0

Ах! Починил это.

Изменение вызова глобалов в конструкторе от

globals(main_method.attr("__dict__")); 

с помощью оператора присваивания вместо:

globals = main_method.attr("__dict__"); 

Оглядываясь назад, что кажется совершенно очевидным, но, по крайней мере, я знаю, что я не был» Единственный, кто сбился с толку, судя по отсутствию кого-то, дергал меня.

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