2016-03-14 3 views
3

Я пытаюсь изучить 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

ответ

1

Изменить это:

self.thisptr = new cppLinearInterpolation(x, y) 

To:

self._thisptr = new cppLinearInterpolation(x, y) 
+0

Благодарим вас за ответ Чарек. Это был мой тип, код все еще не работает с правильным именем thisptr – Damien022

+0

@ Damien022 обновленный ответ –

+0

с последними изменениями, теперь я получаю py_linear_interpolation.pyx: 12: 5: класс класса LinearInterpolation объявлен, но не – Damien022

0

I бы попытаться изменить __cinit__ к

def __init__(self, x, y): 
    self.thisptr = new cppLinearInterpolation(x, y) 

с cpp_linear_interpolation.h и другие файлы не были предоставлены, я не смог проверить это сам.

+0

Благодарим вас за это. Я все еще не нашел решения проблемы, и я попытаюсь написать небольшой и полный новый вопрос о SO. – Damien022

+0

Я еще не получил ответ на вопрос [Cython question] (http://stackoverflow.com/questions/41926482/cython-compileerror-when-attempting-to-compile-extension-type) относительно ошибки компиляции. Вы можете помочь. – Phillip