Example Installation
The Cython module will be compiled at install time
python3.4 -m venv env
source env/bin/activate
pip install -U pip cython
pip install .
# Byte-compiled / optimized / DLL files | |
__pycache__/ | |
*.py[cod] | |
*$py.class | |
# C extensions | |
*.so | |
# Distribution / packaging | |
.Python | |
env/ | |
build/ | |
develop-eggs/ | |
dist/ | |
downloads/ | |
eggs/ | |
.eggs/ | |
lib/ | |
lib64/ | |
parts/ | |
sdist/ | |
var/ | |
*.egg-info/ | |
.installed.cfg | |
*.egg | |
# PyInstaller | |
# Usually these files are written by a python script from a template | |
# before PyInstaller builds the exe, so as to inject date/other infos into it. | |
*.manifest | |
*.spec | |
# Installer logs | |
pip-log.txt | |
pip-delete-this-directory.txt | |
# Unit test / coverage reports | |
htmlcov/ | |
.tox/ | |
.coverage | |
.coverage.* | |
.cache | |
nosetests.xml | |
coverage.xml | |
*,cover | |
.hypothesis/ | |
# Translations | |
*.mo | |
*.pot | |
# Django stuff: | |
*.log | |
local_settings.py | |
# Flask stuff: | |
instance/ | |
.webassets-cache | |
# Scrapy stuff: | |
.scrapy | |
# Sphinx documentation | |
docs/_build/ | |
# PyBuilder | |
target/ | |
# IPython Notebook | |
.ipynb_checkpoints | |
# pyenv | |
.python-version | |
# celery beat schedule file | |
celerybeat-schedule | |
# dotenv | |
.env | |
# virtualenv | |
venv/ | |
ENV/ | |
# Spyder project settings | |
.spyderproject | |
# Rope project settings | |
.ropeproject |
// 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 distutils.extension import Extension | |
from Cython.Distutils import build_ext | |
setup( | |
name='rectangle-example', | |
ext_modules=[ | |
# the .pyx file may not have the same name as the .cpp file | |
Extension("rectangle", ["rectangle_.pyx", "rectangle.cpp"], language="c++",) | |
], | |
cmdclass = {'build_ext': build_ext} | |
) |