Cython c ++示例无法识别c ++,为什么?

时间:2013-08-09 19:36:21

标签: c++ python cython

我正在尝试构建the Cython C++ page中“在cython中使用c ++”的示例,但是setup似乎无法识别语言c ++。

从同一页面获取的文件是:

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

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      # hold a C++ instance which we're wrapping
    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
      ))

我尝试用以下方法构建:

python setup.py --build_ext --inplace

但是这失败了,错误“仅在c ++中允许操作”表明没有正确传递language =“c ++”选项。

cython rectangle.pyx --cplus

确实生成了一个c ++文件,但我希望能够使setup.py方法起作用。

整个错误文本是:

Cythonizing rectangle.pyx

Error compiling Cython file:
------------------------------------------------------------
...
        void move(int, int)

cdef class PyRectangle:
    cdef Rectangle *thisptr      # hold a C++ instance which we're wrapping
    def __cinit__(self, int x0, int y0, int x1, int y1):
        self.thisptr = new Rectangle(x0, y0, x1, y1)
                      ^
------------------------------------------------------------

rectangle.pyx:13:27: Operation only allowed in c++

Error compiling Cython file:
------------------------------------------------------------
...
cdef class PyRectangle:
    cdef Rectangle *thisptr      # hold a C++ instance which we're wrapping
    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
       ^
------------------------------------------------------------

rectangle.pyx:15:8: Operation only allowed in c++
Traceback (most recent call last):
  File "setup.py", line 8, in <module>
    language="c++",             # generate C++ code
  File "/Library/Python/2.7/site-packages/Cython-0.19.1-py2.7-macosx-10.8intel.egg/Cython/Build/Dependencies.py", line 753, in cythonize
    cythonize_one(*args[1:])
  File "/Library/Python/2.7/site-packages/Cython-0.19.1-py2.7-macosx-10.8intel.egg/Cython/Build/Dependencies.py", line 820, in cythonize_one
    raise CompileError(None, pyx_file)
Cython.Compiler.Errors.CompileError: rectangle.pyx

1 个答案:

答案 0 :(得分:9)

完全按照这个例子,在一个非常类似的系统上,一切都适合我。

但是,除了一些其他的差异(一个IndentationError,命名文件rectangle.pyx而不是rect.pyx,...),结果与这个问题无关,你也离开了你的Cython文件的顶部:

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

如果我把它关掉,我会得到同样的错误。