【问题标题】:Cython c++ example fails, why?Cython c++ 示例失败,为什么?
【发布时间】:2015-11-08 20:54:41
【问题描述】:

当我尝试在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-setup.py

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;
}

setup.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
      ))

rect.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)

【问题讨论】:

  • 确实知道python使用缩进而不是花括号来形成块?再次阅读错误消息,然后查看rect.pyx... 从网站复制时不知何故丢失了所有缩进空间。

标签: python c++


【解决方案1】:

非常感谢,swenzel!现在,它可以工作了!

rect.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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多