我一直在将python嵌入到c ++中,我想知道是否有办法找到它
boost :: python :: object的类型,它是执行python模块函数后的结果。我的代码是这样的:
boost::python::object module_ = boost::python::import("..libName");
boost::python::object result_ = module_.attr("..functionName")(arg1, arg2,...);
//suppose if the result is int,
int a_ = boost::python::extract<int>(result_);
从上面的代码片段中,我想知道的是有没有找到类型的方法
提取之前的结果在上面的代码中,result_可能是任何类型,如list,tuple ......
你可以试试这个
std::vector<std::string> list_to_vector(boost::python::list& l)
{
for (int i = 0; i < len(n); ++i)
{
boost::python::extract<boost::python::object> objectExtractor(l[i]);
boost::python::object o=objectExtractor();
std::string object_classname = boost::python::extract<std::string>(o.attr("__class__").attr("__name__"));
std::cout<<"this is an Object: "<<object_classname<<std::endl;
}
...................................................
...................................................
}
这个对我有用。
你可以试试这个
std::vector<std::string> list_to_vector(boost::python::list& l)
{
for (int i = 0; i < len(n); ++i)
{
boost::python::extract<boost::python::object> objectExtractor(l[i]);
boost::python::object o=objectExtractor();
std::string object_classname = boost::python::extract<std::string>(o.attr("__class__").attr("__name__"));
std::cout<<"this is an Object: "<<object_classname<<std::endl;
}
...................................................
...................................................
}
这个对我有用。
有几种方法可以获得对象的类型。您使用哪一个取决于您希望结果的格式。你可以用 result_.attr("__class__")
将类作为boost :: python :: object获取。你也可以使用 PyObject_IsInstance函数 检查它是否是您认为的类型。最后,你可以使用 PyObject_Type函数 将它的类型作为PyObject *获取。
因为您似乎想要检查它是否是整数,您可以使用 extract<T> x(o)
:
boost::python::extract<int> n(o);
if ( n.check() )
// it's an integer, or at least convertible to one
else
// not an integer
该 文件 说:
提取x(o);构造一个提取器,其check()成员函数
可用于询问转换是否可用而不会导致
抛出的异常。
这可能听起来好像可以认为浮动 可转换为整数,但我试过了,但事实并非如此。换句话说,我不会真的相信它每次都做对了!
对于内置类型,在这种情况下是一个整数,我认为它使用起来更安全 PyInt_Check
,但至少在什么时候 一世 在这里测试了一些代码,它没有立即可用。
换句话说,如果你需要确定不是Python内置函数的对象类型,我会遵循 @ Aereaux的建议 使用 PyObject_IsInstance
。 (但我个人更喜欢拥有一个干净的Boost Python代码库,而不是混合代码库。)