Calling C code from Python via Cython
If you need more information what Cython is, take a look here: http://cython.readthedocs.io/.
This sample, is a simple “Hello world” code for macOS based installation of Python and Cython.
First step is to get Cython for your platform. You can use pip to achieve that
# Installation of Cython at macOS # I prefer to use Virtualenv contrary to OS based installation # If you need more info about Virtualenv, take a look here # # https://virtualenv.pypa.io/ > virtualenv venv > source venv/bin/activate > pip install Cython
After you are done with that, you can create sample code. We will call method in C that accepts one argument – char * – and prints the string on stdout.
/* hello.c */ #include <stdio.h> void f(char *str) { printf("str: %s\n", str); }
Next thing we need is a Cython based wrapper for the code we want to call
''' hello_caller.pyx ''' cdef extern from "hello.c": void f(char *) ''' take a look here for details about different Cython declarations http://notes-on-cython.readthedocs.io/en/latest/function_declarations.html ''' cpdef hello_world(str): f(str)
Last thing we need is a setup.py script for Cython that will perform the build
''' setup.py ''' from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext sourcefiles = ['hello_caller.pyx'] ext_modules = [Extension("hello_caller", sourcefiles )] setup( name = 'Hello world', cmdclass = {'build_ext': build_ext}, ext_modules = ext_modules )
After everything is set up, we can build everything
> python setup.py build_ext --inplace
and, eventually, we can call C code from Python code
''' script.py ''' #!/bin/python import hello_caller message = "Hello world" hello_caller.hello_world(message)
by running
> python ./script.py str: Hello world