Как вернуть новые объекты C ++ в Cython?

Я подозреваю, что есть простой ответ на этот вопрос, но мне нужна помощь, чтобы начать работу с Cython. У меня есть существующая кодовая база C ++, которую я хочу представить в Python через Cython. Для каждого класса, который я хочу выставить, я создаю Cython cppclass _ClassName и класс оболочки Python ClassName,

Минимальный пример:

Object.h
CythonMinimal.pyx
setup.py

содержание Object.h:

class Object {

public:

Object clone() {
Object o;
return o;
}

};

содержание CythonMinimal.pyx:

cdef extern from "Object.h":
cdef cppclass _Object "Object":
_Object() except +
_Object clone()cdef class Object:

cdef _Object *thisptr

def __cinit__(self):
self.thisptr = new _Object()

def __dealloc__(self):
del self.thisptr

def clone(self):
return self.thisptr.clone()

содержание setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
from Cython.Distutils import build_ext

import os

os.environ["CC"] = "g++-4.7"os.environ["CXX"] = "g++-4.7"

modules = [Extension("CythonMinimal",
["CythonMinimal.pyx"],
language = "c++",
extra_compile_args=["-std=c++11"],
extra_link_args=["-std=c++11"])]

for e in modules:
e.cython_directives = {"embedsignature" : True}

setup(name="CythonMinimal",
cmdclass={"build_ext": build_ext},
ext_modules=modules)

Это ошибка, которую я получаю при компиляции:

cls ~/workspace/CythonMinimal $ python3 setup.py build
running build
running build_ext
cythoning CythonMinimal.pyx to CythonMinimal.cpp

Error compiling Cython file:
------------------------------------------------------------
...

def __dealloc__(self):
del self.thisptr

def clone(self):
return self.thisptr.clone()
^
------------------------------------------------------------

CythonMinimal.pyx:18:27: Cannot convert '_Object' to Python object
building 'CythonMinimal' extension
creating build
creating build/temp.macosx-10.8-x86_64-3.3
g++-4.7 -Wno-unused-result -fno-common -dynamic -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -I/usr/local/include -I/usr/local/opt/sqlite/include -I/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/include/python3.3m -c CythonMinimal.cpp -o build/temp.macosx-10.8-x86_64-3.3/CythonMinimal.o -std=c++11
cc1plus: warning: command line option '-Wstrict-prototypes' is valid for C/ObjC but not for C++ [enabled by default]
CythonMinimal.cpp:1:2: error: #error Do not use this file, it is the result of a failed Cython compilation.
error: command 'g++-4.7' failed with exit status 1

Я предполагаю что _Object.clone должен вернуть _Object (тип cppclass), но Objet.clone должен вернуть Object (Тип Python). Но как?

7

Решение

Вы возвращаете объект C ++ в функции Python, которой разрешено возвращать только объекты Python:

def clone(self):
return self.thisptr.clone()

Сделай это так:

cdef _Object clone(self) except *:
return self.thisptr.clone()

Но это зависит от того, что вы пытаетесь сделать, вы, вероятно, захотите вернуть Object, а не _Object, поэтому я бы изменил его следующим образом:

cdef class Object:
cdef _Object thisobj
cdef _Object *thisptr

def __cinit__(self, Object obj=None):
if obj:
self.thisobj = obj.thisobj.clone()
self.thisptr = &self.thisobj

def __dealloc__(self):
pass

def clone(self):
return Object(self)
5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector