我正在尝试在c ++中为numpy创建一维数组:
PyObject* foo()
{
npy_intp length[1];
length[0] = 10;
PyObject* my_array = PyArray_SimpleNew(1, length, NPY_DOUBLE);
return boost::python::incref(my_array);
}
然后我创建了一个python模块:
BOOST_PYTHON_MODULE(pyMod)
{
using namespace boost::python;
import_array();
def("foo", foo);
}
当我在python中运行它,调用foo()时,它在执行对PyArray_SimpleNew的调用时会出现段错误,即使我调用了import_array,这似乎是这个segfaulting的常见原因。如果我制作尺寸为2D的数组[10,1],它就可以正常工作,即:
PyObject* foo()
{
npy_intp length[2] = {10, 1};
PyObject* my_array = PyArray_SimpleNew(2, length, NPY_DOUBLE);
return boost::python::incref(my_array);
}
在python中,它就像这样使用
import numpy as np
import pyMod
if __name__ == "__main__":
v = pyMod.foo()
为什么会出现这种段错误?
答案 0 :(得分:0)
我不确定你是如何将PyObject *暴露给Python的,但我认为正确的方法是通过boost :: python :: object公开它。
另一点是你使用PyObject调用boost :: python :: object。尽管可能,但不建议这样做(参见David Abrahams撰写的guidelines)。所以应该使用boost :: python :: handle来解决这种情况。
boost::python::object foo()
{
npy_intp dims[1] = {10};
PyObject* p_array = PyArray_SimpleNew(boost::size(dims), dims, NPY_FLOAT);
boost::python::handle<> handle(boost::python::borrowed(p_array));
return boost::python::object(handle);
}