Я пытаюсь изучить cython, реализуя линейный интерполятор от C++ до Python. Я пытаюсь использовать заголовочные файлы PXD для окончательного объекта Intepolator, чтобы его можно было повторно использовать в других методах/классах по строке, поэтому я хочу иметь заголовочный файл PXD.Cython PXD, похоже, не используется для файла PYX
У меня есть cpp_linear_interpolation.cpp и cpp_linear_interpolation.h, которые работают нормально, интерполятор получает экземпляр с двумя векторами double (x и y) в качестве входных данных.
Есть мои файлы
cy_linear_interpolation.pxd
# distutils: language = c++
import cython
import numpy as np
cimport numpy as np
from libcpp.vector cimport vector
cdef extern from "cpp_linear_interpolation.h":
cdef cppclass cppLinearInterpolation:
cppLinearInterpolation(vector[double], vector[double]) except +
vector[double] interp(vector[double]) except +
vector[double] m_x
vector[double] m_y
int m_len
double m_x_min
double m_x_max
py_linear_interpolation.pxd
from cy_linear_interpolation cimport cppLinearInterpolation
cdef class LinearInterpolation:
cdef cppLinearInterpolation * thisptr
py_linear_interpolation.pyx
import cython
import numpy as np
cimport numpy as np
from libcpp.vector cimport vector
from cy_linear_interpolation cimport cppLinearInterpolation
cdef class LinearInterpolation:
# cdef cppLinearInterpolation *thisptr
def __cinit__(self,vector[double] x,vector[double] y):
self.thisptr = new cppLinearInterpolation(x, y)
def __dealloc__(self):
del self.thisptr
def interpolate(self,vector[double] x_new):
return self.thisptr.interp(x_new)
setup.py
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy
setup(name = 'Cython_LinInt',
ext_modules=[Extension("cython_linear_interpolation",
sources=["py_linear_interpolation.pyx", "cpp_linear_interpolation.cpp",],
language="c++",
include_dirs=[numpy.get_include()])
],
cmdclass = {'build_ext': build_ext},
)
компиляции с Microsoft (R) C/C++ оптимизирующий компилятор версии 15.00.30729.01 для x64
Я получаю сообщение об ошибке
Невозможно преобразовать 'cppLinearInterpolation *' в объект Python
Если переместить
cdef cppLinearInterpolation * _thisptr
в файл Pyx (комментируемого из линии в py_linear_interpolation.pyx), он компилирует и бежать, но я не могу получить доступ к указатель из другого файла Cython. В идеале я мог бы создать экземпляр интерполятора из python и использовать его в качестве аргумента для других функций python/cython. Уверен, что я должен делать что-то глупое, но я был заблокирован этой проблемой на некоторое время и не нашел решения ...
EDIT: появилась опечатка в py_linear_interpolation.pyx, теперь исправлено EDIT 2: тот же тип был в py_linear_interpolation.pyd, имя члена isptr, код все еще не компилируется, и я получаю ту же ошибку. Это не кажется, что Cython компилятор признает, что self.thisptr не является объектом питона и должен быть указателем на cppLinearInterpolation
Благодарим вас за ответ Чарек. Это был мой тип, код все еще не работает с правильным именем thisptr – Damien022
@ Damien022 обновленный ответ –
с последними изменениями, теперь я получаю py_linear_interpolation.pyx: 12: 5: класс класса LinearInterpolation объявлен, но не – Damien022