Cython: как передать класс c ++ в качестве аргумента классу Cython, который обертывает класс c ++? - PullRequest
0 голосов
/ 31 марта 2020

Я борюсь с CYTHON, пытаюсь сделать копию класса C ++ в классе Python. У меня .pxd у меня есть:

cdef extern from "MyCppClass.h":
    cdef cppclass MyCppClass:
        MyCppClass ()
        int        Copy(MyCppClass * Source)


cdef class MyPyClass:
    cdef MyCppClass * thisptr
    cdef copy(self, MyCppClass *s)

и в .pyx у меня есть

cdef class MyPyClass: 
    def __init__(self): 
        self.thisptr = new MyCppClass ()

    cdef copy(self, MyCppClass * s):    
         self.thisptr.Copy(s)

Компиляция в порядке.

Затем я пытаюсь использовать его в другой модуль Cython:

A=new MyCppClass()
pA=MyPyClass()
… do some stuff on A
p1.copy(A)

И я получаю обычное «не может преобразовать в Python объект». Я пытался скопировать множество вещей, например:

 cdef getThisptr(self):
    return self.thisptr

A=new MyCppClass()
pA=MyPyClass()
B=pA.getThisptr()
B.Copy(A)

Но ничего работает!

На Cython звучит очень просто c, но я все еще жду решения ...

1 Ответ

0 голосов
/ 31 марта 2020

Тебе не хватает cimport. Чтобы Cython знал о ваших cdef определенных типах и функциях, вам нужно добавить

from module_name cimport MyPyClass

В противном случае он просто предполагает, что Copy - это Python функция, принимающая объект Python.

Соответствующий бит документации

...