构建 Numpy C++ 扩展;调用 PyArray_FROM_OTF 时出现段错误

Posted

技术标签:

【中文标题】构建 Numpy C++ 扩展;调用 PyArray_FROM_OTF 时出现段错误【英文标题】:Building Numpy C++ extension; segfault when calling PyArray_FROM_OTF 【发布时间】:2020-03-18 21:56:05 【问题描述】:

我正在学习如何为 Numpy 构建扩展。我正在关注的教程是这个:

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

我的代码如下:

模块.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

现在这一切似乎工作正常,但由于调用 PyArray_FROM_OTF 的行,我得到了一个段错误。

谁能解释我做错了什么?

非常感谢任何指导。

【问题讨论】:

您找到解决方案了吗? 【参考方案1】:

return PyModule_Create(&amp;matrixsolvers_module);之前添加import_array();

详情请见https://numpy.org/devdocs/user/c-info.how-to-extend.html

【讨论】:

非常感谢,你帮我省了一天的头痛!

以上是关于构建 Numpy C++ 扩展;调用 PyArray_FROM_OTF 时出现段错误的主要内容,如果未能解决你的问题,请参考以下文章

Numpy C API - 使用 PyArray_Descr 创建数组会导致段错误

Python 的 C++ 扩展模块返回一个 Numpy 数组

将 C++ 数组发送到 Python 并返回(使用 Numpy 扩展 C++)

使用 numpy 和 gdal 的 Python C 扩展在运行时给出未定义的符号

PyArray_Check / PyArray_CheckExact 给出分段错误

扩展 Python:处理 numpy 数组