在c ++中,我定义了以下模块:
#include <boost/python.hpp>
#include <numpy/arrayobject.h>
bool foo(PyObject *obj)
{
if (!PyArray_CheckExact(obj))
return false;
PyArrayObject* arr = reinterpret_cast<PyArrayObject*>(obj);
if (PyArray_NDIM(arr) != 2)
return false;
return true;
}
BOOST_PYTHON_MODULE(pyMod)
{
using namespace boost::python;
import_array();
def("foo", foo);
}
在python中,我执行以下操作
import numpy as np
import myMod
if __name__ == "__main__":
arr = np.zeros(shape=(100, 100), dtype=np.uint8)
myMod.foo(arr)
这在执行对PyArray_CheckExact的调用时会出现分段错误。删除检查,函数运行正常,并且转换成功。
我试过了:
bool foo(PyObject *obj)
{
if (obj->ob_type->ob_type != &PyArray_Type)
return false;
PyArrayObject* arr = reinterpret_cast<PyArrayObject*>(obj);
if (PyArray_NDIM(arr) != 2)
return false;
return true;
}
其中还有段错误。似乎Numpy API中的某些内容未正确初始化。我在Windows上使用Anaconda2 32bit。
关于为什么会出现这种段错误的想法?