我正在尝试重构项目的一部分,尤其是Python / C ++接口。
标准的boost :: python python初始化之前可以进行以下工作:
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>
我唯一能想到的是,它与在使用它之前声明“ globals”有关。在这种情况下,还有其他方法可以做到这一点吗?
最佳答案
啊!固定它。
将构造函数中对全局变量的调用从
globals(main_method.attr("__dict__"));
改为使用赋值运算符:
globals = main_method.attr("__dict__");
往回看,这似乎很明显,但至少我知道,由于没有人欺骗我,我并不是唯一一个受挫的人。