Синтаксическая ошибка в примере Cython

0

Я пытаюсь создать пример Cython на этой странице.

Я знаю, что мой пост очень похож на другой вопрос. Однако я генерировал совершенно разные сообщения об ошибках.

Вот мой код:

Rectangle.cpp

#include "Rectangle.h"

using namespace shapes;

Rectangle::Rectangle(int X0, int Y0, int X1, int Y1){
    x0 = X0;
    y0 = Y0;
    x1 = X1;
    y1 = Y1;
}

Rectangle::~Rectangle() {}

int Rectangle::getLength() {
    return (x1 - x0);
}

int Rectangle::getHeight() {
    return (y1 - y0);
} 

int Rectangle::getArea() {
    return (x1 - x0) * (y1 - y0);
}

void Rectangle::move(int dx, int dy) {
    x0 += dx;
    y0 += dy;
    x1 += dx;
    y1 += dy;
}

Rectangle.h

namespace shapes {
    class Rectangle {
    public:
    int x0, y0, x1, y1;
    Rectangle(int x0, int y0, int x1, int y1);
    ~Rectangle();
    int getLength();
    int getHeight();
    int getArea();
    void move(int dx, int dy);
    };
 }

rectangle.pyx

# distutils: language = c++
# distutils: sources = Rectangle.cpp

cdef extern from "Rectangle.h" namespace "shapes":
    cdef cppclass Rectangle:
        Rectangle(int, int, int, int)
        int x0, y0, x1, y1
        int getLength()
        int getHeight()
        int getArea()
        void move(int, int)

cdef class PyRectangle:
    cdef Rectangle *thisptr
    def __cinit__(self, int x0, int y0, int x1, int y1):
        self.thisptr = new Rectangle(x0, y0, x1, y1)
    def __dealloc__(self):
        del self.thisptr
    def getLength(self):
        return self.thisptr.getLength()
    def getHeight(self):
        return self.thisptr.getHeight()
    def getArea(self):
        return self.thisptr.getArea()
    def move(self, dx, dy):
        self.thisptr.move(dx, dy)

setup.py

from distutils.core import setup
from Cython.Build import cythonize

setup(ext_modules = cythonize(
       "rectangle.pyx",            # our Cython source
       sources=["Rectangle.cpp"],  # additional source file(s)
       language="c++",             # generate C++ code
      ))

Я должен признать, что у меня была та же ошибка, что и отсутствие следующих строк в rectangle.pyx в первую очередь.

# distutils: language = c++
# distutils: sources = Rectangle.cpp

Прочитав сообщение здесь, я понял это и исправил его.

Однако, когда я использую следующий оператор для компиляции класса C++

python rectangle.pyx

Я получил сообщение об ошибке:

File "rectangle.pyx", line 4
    cdef extern from "Rectangle.h" namespace "shapes":
              ^
SyntaxError: invalid syntax

Почему эта ошибка появляется? Могу ли я узнать, как это исправить?

Большое спасибо. :)

================================================== знак равно

PS: Когда я пытаюсь запустить setup.py, у меня была ошибка g++:

Я побежал:

python setup.py build_ext

и ошибка g++

error: command 'g++' failed with exit status 1
Теги:
cython

1 ответ

0
Лучший ответ

Согласно совету @Бакуриу, я нашел следующие процедуры:

предположим, что вы используете командную строку

  1. cd в каталог, содержащий файлы .pyx и setup.
  2. используя Cython для построения расширения, например

    Cython -a rect.pyx --cplus

  3. используя Python для настройки расширения, например

    Python setup.py build_ext --inplace

При использовании расширения вы можете:

  1. добавьте каталог.pyd файла в системный путь

    import sys

    sys.path.append("C:\\yourDirectory")

  2. используя расширение, как вам нравится :)

    import Rectangle

    r = Rectangle.PyRectangle(1,2,3,4)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню