构建 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(&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 扩展在运行时给出未定义的符号