我想使用boost :: python来包装一个返回python值的函数
array(28.4)
类型
numpy.ndarray
我还没能将这个值提取到c ++类型。以下是我迄今为止提出的结果(以及结果):
double resultValue = python::extract<double>(result[0]);
:0-d数组无法编入索引
double resultValue = python::extract<double>(result);
:没有已注册的转换器能够从numpy.ndarray类型的Python对象生成类型为double的C ++ rvalue
void* resultValue = python::extract<void*>(result);
:没有已注册的转换器能够从numpy.ndarray类型的Python对象中提取C ++指针以键入void * __ptr64
有人希望,上一版本中的标准黑客可行 - 但它没有。到目前为止我没有尝试任何std :: type,例如vector。
有什么想法吗?
答案 0 :(得分:2)
也许这会有所帮助:
#include <boost/python.hpp>
#include <boost/numpy.hpp>
namespace bp = boost::python;
namespace bn = boost::numpy;
#define PY_ASSERT(expr) { if(!(expr)) { \
PyErr_SetString(PyExc_TypeError, (boost::format("PY_ASSERT(%1%:%2%): !(%3%) '%4%'") % (__FILE__) % (__LINE__) % (expr) % (#expr)).str().c_str()); \
bp::throw_error_already_set(); \
}; };
#define PY_ASSERT_EQUALS(a, b) { if((a) != (b)) { \
PyErr_SetString(PyExc_TypeError, (boost::format("PY_ASSERT_EQUALS(%1%:%2%): %3% != %4%") % (__FILE__) % (__LINE__) % (a) % (b)).str().c_str()); \
bp::throw_error_already_set(); \
}; };
....
auto ret_ext = bp::extract<bn::ndarray>(result);
PY_ASSERT(ret_ext.check());
const bn::ndarray& ret = ret_ext();
PY_ASSERT(bn::equivalent(ret.get_dtype(), bn::dtype::get_builtin<double>()) );
PY_ASSERT_EQUALS(ret.get_nd(), 1);
PY_ASSERT_EQUALS(ret.shape(0), 1);
double resultValue = *reinterpret_cast<double*>(mean.get_data());
请注意,这是未经测试的代码,并未附带保修。
干杯
本