Cython c++示例失败了,原因是什么

Cython c++ example fails, why?

本文关键字:是什么 失败 c++ Cython      更新时间:2023-10-16

当我尝试在http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html,我在mac终端上得到了以下错误:

Error compiling Cython file:
 distutils: language = c++
 distutils: sources = Rectangle.cpp
cdef extern from "Rectangle.h" namespace "shapes":
cdef cppclass Rectangle:

rect.pyx:5:0: Expected an increase in indentation level
Traceback (most recent call last):
  File "setup.py", line 8, in <module>
    language="c++",                        # generate and compile C++ code
  File "/usr/local/lib/python2.7/site-packages/Cython/Build/Dependencies.py", line 877, in cythonize
    cythonize_one(*args)
  File "/usr/local/lib/python2.7/site-packages/Cython/Build/Dependencies.py", line 997, in cythonize_one
    raise CompileError(None, pyx_file)
Cython.Compiler.Errors.CompileError: rect.pyx

我不确定我的代码出了什么问题。你能告诉我为什么收到错误信息吗?

我的机器中有Cython 0.23.4和Python 2.7.10。我运行python/c++代码没有任何问题。我还在电脑上安装了boost和boost python。

简单地说,我创建了以下文件:

1-矩形.h

2-矩形.cpp

3套

4-rect.pyx

然后,我做了"python setup.py build_ext--inplace"

矩形.h

#include <stdio.h>
namespace shapes {
    class Rectangle {
    public:
        int x0, y0, x1, y1;
        Rectangle(int x0, int y0, int x1, int y1);
        ~Rectangle();
        int getLength() const;
        int getHeight() const;
        int getArea() const;
        void move(int dx, int dy);
    };
}

矩形.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() const {
    return (x1 - x0);
}
int Rectangle::getHeight() const {
    return (y1 - y0);
}
int Rectangle::getArea() const {
    return getLength() * getHeight();
}
void Rectangle::move(int dx, int dy) {
    x0 += dx;
    y0 += dy;
    x1 += dx;
    y1 += dy;
}

设置.py

from distutils.core import setup, Extension
from Cython.Build import cythonize
setup(ext_modules = cythonize(Extension(
                                        "rect",                                # the extesion name
                                        sources=["rect.pyx", "Rectangle.cpp"], # the Cython source and
                                        # additional C++ source files
                                        language="c++",                        # generate and compile C++ code
                                        )))

我也尝试了以下方法:

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

矩形pyx

# distutils: language = c++
# distutils: sources = Rectangle.cpp
cdef extern from "Rectangle.h" namespace "shapes":
cdef cppclass Rectangle:
Rectangle(int, int, int, int) except +
int x0, y0, x1, y1
int getLength() const
int getHeight() const
int getArea() const
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)

非常感谢,swenzel!现在,它起作用了!

矩形pyx

# distutils: language = c++
# distutils: sources = Rectangle.cpp
cdef extern from "Rectangle.h" namespace "shapes":
    cdef cppclass Rectangle:
        Rectangle(int, int, int, int) except +
        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)