Я прошу вашей помощи, потому что я пытаюсь запустить пример с Cython немного более сложным, чем пример с одним классом, который можно найти во многих руководствах (например, это руководство ). Я не нашел никакого «более продвинутого» учебника, поэтому я надеюсь, что этот вопрос будет полезен и для людей, которые пытаются изучить его немного глубже.
Я напишу здесь шаги, которые я предпринял, надеясь, что кто-то скажет мне, где моя ошибка.
У меня есть класс Rectangle c ++ (для краткости я поместил здесь только файл .h):
#ifndef RECTANGLE_H
#define RECTANGLE_H
namespace shapes {
class Rectangle {
public:
int x0, y0, x1, y1;
Rectangle();
Rectangle(int x0, int y0, int x1, int y1);
~Rectangle();
int getArea();
};
}
#endif
и Group2 класс. Очень простой пример класса, конструктор которого принимает в качестве входных данных 2 прямоугольника:
#ifndef GROUP4_H
#define GROUP4_H
#include "Rectangle.h"
namespace shapes{
class Group2 {
public:
Rectangle rect0, rect1, rect2, rect3 ;
Group2();
Group2(Rectangle rect0, Rectangle rect1);
~Group2();
void getAreas(int *area0, int *area1);
};
}
#endif
Затем я создаю grp2.pyx файл с определением Rectangle и Group2 class:
#RECTANGLE
cdef extern from "Rectangle.h" namespace "shapes":
cdef cppclass Rectangle:
Rectangle() except +
Rectangle(int, int, int, int) except +
int x0, y0, x1, y1
int getArea()
cdef class PyRectangle:
cdef Rectangle c_rect
def __cinit__(self, int x0, int y0, int x1, int y1):
self.c_rect = Rectangle(x0, y0, x1, y1)
def get_area(self):
return self.c_rect.getArea()
# GROUP2
cdef extern from "Group2.h" namespace "shapes":
cdef cppclass Group2:
Group2() except +
Group2(Rectangle rect0, Rectangle rect1) except +
void getAreas(int *area0, int *area1)
cdef class PyGroup2:
cdef Group2 c_group2
def __cinit__(self, Rectangle rect0, Rectangle rect1):
self.c_group2 = Group2(rect0, rect1)
def get_areas(self):
cdef int area0, area1
self.c_group2.getAreas(&area0, &area1)
return area0, area1
Затем я компилирую эти два класса в статической библиотеке c ++ с командной строкой:
gcc -c -fPIC Group2.cpp Rectangle.cpp
и
ar rcs libexample.a Group2.o Rectangle.o
Для завершения я создаю файл cython setup.py , который я вызываю из командной строки:
from distutils.core import setup, Extension
from Cython.Build import cythonize
setup(ext_modules = cythonize(Extension(
name="grp2", # the extension name
sources=["grp2.pyx"], # the Cython source and
libraries=["example"],
library_dirs=["lib"],
include_dirs=["lib"],
# additional C++ source files
language="c++", # generate and compile C++ code
)))
На данный момент у меня есть ошибка в _cinint_ из PyGroup2 :
Невозможно преобразовать аргумент объекта Python в тип 'Rectangle'
Полагаю, в моем файле pyx есть какая-то ошибка, но я не могу сказать, что именно, так как я определяю Rectangle для python.