Расширение Numpy C ++; segfault при вызове PyArray_FROM_OTF - PullRequest
0 голосов
/ 19 марта 2020

Я учусь строить расширения для Numpy. Вот следующий урок:

https://gist.github.com/kanhua/8f1eb7c67f5a031633121b6b187b8dc9

Мой код выглядит следующим образом:

module. cpp

#include "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/include/python3.7m/Python.h"

#include "numpy/ndarraytypes.h"
#include "numpy/ufuncobject.h"
#include "numpy/npy_3kcompat.h"

#include <iostream>

PyObject* get_dimension(PyObject *dummy, PyObject* args) {
    PyObject *arg1=NULL;
    PyObject *arr1=NULL;
    int nd = 1;

    if (!PyArg_ParseTuple(args, "O", &arg1))
        return NULL;

    // THIS LINE PRINTS A VALID ADDRESS
    std::cout << arg1 << std::endl;

    //=====================
    // PROBLEM AT THIS LINE
    //=====================
    arr1 = PyArray_FROM_OTF(arg1, NPY_DOUBLE, NPY_ARRAY_IN_ARRAY);

    return PyInt_FromLong(nd);
}

static PyMethodDef matrixsolvers_methods[] = {
    // The first property is the name exposed to Python, fast_tanh, the second is the C++
    // function name that contains the implementation.
    { "get_dimension", (PyCFunction) get_dimension, METH_VARARGS, nullptr },

    // Terminate the array with an object containing nulls.
    { nullptr, nullptr, 0, nullptr }
};

static PyModuleDef matrixsolvers_module = {
    PyModuleDef_HEAD_INIT,
    "matrixsolvers",                        // Module name to use with Python import statements
    "Provides some functions, but faster",  // Module description
    0,
    matrixsolvers_methods                   // Structure that defines the methods of the module
};

PyMODINIT_FUNC PyInit_matrixsolvers() {
    return PyModule_Create(&matrixsolvers_module);
}

setup.py

from distutils.core import setup, Extension
from numpy import get_include

ms_module = Extension('matrixsolvers', sources=['module.cpp'], include_dirs=[get_include()])

setup(name='matrixsolvers', version='1.0',
      description='Python Package that implements matrix solvers in C++',
      ext_modules=[ms_module]
      )

main.py

from matrixsolvers import get_dimension
import numpy as np

get_dimension(np.array([1,2,3]))

Для запуска мой код, я запускаю следующее в терминале:

pip3 install . 
python3 main.py

Теперь все это, кажется, работает нормально, но я получаю segfault из-за строки, которая вызывает PyArray_FROM_OTF.

Может кто-нибудь объяснить, что я делаю не так?

Любое руководство очень ценится.

...