PyArray\u Check/PyArray\u CheckExact给出分段错误 在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); }

PyArray\u Check/PyArray\u CheckExact给出分段错误 在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,c++,numpy,boost-python,Python,C++,Numpy,Boost Python,这会在执行对PyArray_CheckExact的调用时产生分段错误。删除该复选框后,函数运行正常,强制转换成功 我试过这个: bool foo(PyObject *obj) { if (obj->ob_type->ob_type != &PyArray_Type) return false; PyArrayObject* arr = reinterpret_cast<PyArrayObject*>(obj); if (

这会在执行对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;    
}
bool-foo(PyObject*obj)
{
if(对象->对象类型->对象类型!=&PyArray\u类型)
返回false;
PyarayObject*arr=重新解释铸件(obj);
如果(PyArray_NDIM(arr)!=2)
返回false;
返回true;
}
这也会造成断层。它看起来像是Numpy API中没有正确初始化的东西。我在windows上使用Anaconda232位


你知道为什么会出现这种情况吗?

我想你还没有完全理解boost_python!您不应该直接使用它来处理PyObject*,而应该使用boost::python::object。无论如何,代码是有效的,您可能有一些库损坏,以便接收segvfault。尝试重新安装它。另一点,第一个
if
条件中应该有一个
not
,但是numpy对象不是boost::python对象。应该使用boost::python::object()作为输入,然后使用boost::python::object::ptr()获取PyObject吗?我找到的大多数示例代码都按照上面的方法执行。
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;    
}