我试图使用numpy C API来检查对象的整数类型(numpy类型以及python整数)。我正在执行以下操作:
使用以下命令创建cython test.pyx
:
cdef extern from "numpy/ndarrayobject.h":
bint PyArray_IsIntegerScalar(obj)
def check_int(object obj):
return PyArray_IsIntegerScalar(obj)
使用python setup.py build_ext --inplace
进行编译。 setup.py
为:
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules=cythonize('test.pyx',
annotate=True,
language_level=3)
)
然后使用以下最简单的内容运行test.py
:
import test
print(test.check_int(1.1))
但是我收到Segmentation fault (core dumped)
。我错过了什么?甚至找不到PyArray_IsIntegerScalar
的{{3}}。只需在numpy doc中找到它即可。
numpy 1.16.4 Cython 0.29.2
答案 0 :(得分:1)
您需要先调用Numpy's import_array
function,然后才能使用Numpy C API。这意味着在模块初始化时(即在全局范围的顶部)进行此操作:
cimport numpy
numpy.import_array()
# your code goes here, unchanged
(您也可以在import_arrray
块中获得cdef extern
而不是cimport)