Cython的cpython.datetime.datetime_new导致分段错误

时间:2017-10-23 03:10:45

标签: python datetime cython

Cython的datetime.pyd公开了一个datetime_new函数,它是datetime.h PyDateTime_CAPI.DateTime_FromDateAndTime的包装器。但是,每当我实际尝试使用此函数时,即使使用有效值,我也会立即得到分段错误。这是一个Cython代码的最小工作示例:

cimport cpython.datetime

cpdef cpython.datetime.datetime construct_datetime():
    return cpython.datetime.datetime_new(2017, 12, 1, 12, 30, 15, 0, None)

以下是setup.py

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize('test_segfault.pyx'))

如果我运行它,我会得到这个:

$ python setup.py build_ext --inplace > /dev/null
$ $ python -c 'from test_segfault import construct_datetime; construct_datetime()'
Segmentation fault (core dumped)

我在Arch Linux,Python 3.6.1上使用Cython版本0.25.2:

$ python -c 'import sys; print(sys.version)'
3.6.1 |Continuum Analytics, Inc.| (default, May 11 2017, 13:09:58) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]

我使用此功能错了吗?我知道我可以在此处调用标准cpython.datetime.datetime构造函数,但是datetime_new会绕过范围检查,并且我试图查看其他检查需要多长时间。

1 个答案:

答案 0 :(得分:3)

你忘了initialize the datetime C API

# Datetime C API initialization function.
# You have to call it before any usage of DateTime CAPI functions.
cdef inline void import_datetime():
    PyDateTime_IMPORT