'PyArray_Check / PyArray_CheckExact gives segmentation fault
In c++, I define the following module:
#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);
}
In python, I do the following
import numpy as np
import myMod
if __name__ == "__main__":
    arr = np.zeros(shape=(100, 100), dtype=np.uint8)
    myMod.foo(arr)
This gives segmentation fault when executing the call to PyArray_CheckExact. Removing the check, the function runs fine and the cast is successfull.
I tried this:
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;    
}
Which also segfaults. It seems like something in the Numpy API which is not correctly initialized. I use Anaconda2 32bit on windows.
Any ideas on why this segfaults?
Solution 1:[1]
You need to first call
import_array();
Within your C code. If not this will cause a segfault.
This is the issue that impacted me.
There are only 2 ways this can cause problems.
- PyArrayObj is NULL
- import_array() has not been called.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source | 
|---|---|
| Solution 1 | Yunnosch | 
