2017-10-23 6 views
0

Cython des datetime.pyd stellt eine datetime_new-Funktion, die ein Wrapper um PyDateTime_CAPI.DateTime_FromDateAndTime s datetime.h‘ist. Jedoch, wenn ich versuche, diese Funktion zu verwenden, bekomme ich sofort einen Segmentierungsfehler, sogar mit gültigen Werten. Hier ist ein minimales Arbeitsbeispiel Cython Code:Cython des cpython.datetime.datetime_new verursacht Segmentation fault

cimport cpython.datetime 

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

Hier wird die setup.py:

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

Und wenn ich es laufen bekomme ich diese:

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

Ich verwende Cython Version 0.25.2 auf Arch Linux, Python 3.6.1:

$ 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)] 

Verwende ich diese Funktion falsch? Ich bin mir bewusst, dass ich hier einfach den Standard cpython.datetime.datetime Konstruktor aufrufen kann, aber datetime_new umgeht die Bereichsüberprüfungen, und ich versuche zu sehen, wie viel Zeit die zusätzlichen Prüfungen dauern.

Antwort

1

Sie haben vergessen zu 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 
+0

Sicher tat. Meine Güte. Irgendwie hatte ich den Eindruck, dass ich schon von 'cimport cpython.datetime' gerufen wurde, aber nein, das war nur meine Dummheit. Vielen Dank. – Paul