CFFI ermöglicht Zugriff auf C-Funktionen mit Python

Ziel von CFFI ist es, eine Möglichkeit bereitzustellen, mit der aus Python Anwendungen relativ einfach auf C Code und dessen Funktionen zugegriffen werden kann.

Damit das Foreign Function Interface (FFI) mit Python verwendet werden kann, muss das cffi Paket installiert sein. Zum jetzigen Zeitpunkt lässt es sich unter einigen Linux Distributionen bereits über den Paketmanager installieren. Ist das nicht der Fall oder wird eine neuer Version benötigt kann es auch direkt aus dem PyPI installiert werden. Für eine erfolgreiche Installation werden noch die Python und die ffi Header-Dateien benötigt. Bei Ubuntu müssen hierfür die Pakete python-dev und libffi-dev installiert werden. Eine genauere Beschreibung kann die CFFI Dokumentation entnommen werden.

Sind alle Voraussetzungen erfüllt, sollte die Installation des cffi Paketes wie folgt möglich sein.

$ pip install cffi

Nach der Installation kann es ohne weitere Konfiguration verwendet werden.

Die folgenden Beispiele stammen aus der offiziellen CFFI Dokumentation und wurde für die Verwendung mit Python 3.x leicht modifiziert, in dem statt String an zwei Stellen Bytes verwendet wird. Im ersten Schritt wird eine neue Instanz der FFI()-Klasse erstellt. Anschließend werden der Funktion cdef() alle Funktionen, Variablen etc. übergeben, die später in Python verfügbar sein sollen. Diese Informationen können einfach aus den entsprechenden Header-Dateien oder der Dokumentation der C-Bibliothek übernommen werden. Zu guter letzt werden noch die benötigten Bibliotheken geladen.

>>> from cffi import FFI
>>> ffi = FFI()
>>> ffi.cdef("""
...     int printf(const char *format, ...);   // copy-pasted from the man page
... """)
>>> C = ffi.dlopen(None)                     # loads the entire C namespace

Anschließend die sollten die angegeben Funktionen etc. in Python zur Verfügung stehen. Im folgenden Beispiel wird zunächst eine neue Variable initialisiert und anschließend die anfangs angegeben Funktion printf() aufgerufen und ihr die Variable übergeben.

>>> arg = ffi.new("char[]", b"world")         # equivalent to C code: char arg[] = "world";
>>> C.printf(b"hi there, %s!\n", arg)         # call printf
hi there, world!
17

Bereits nach ersten Tests und der Verwendung in einem anderen Projekt erwies sich CFFI als sehr praktisch und komfortabel. So war ein funktionierender Prototyp meist in relativ kurzer Zeit und mit wenig Aufwand umgesetzt. Ein weiterer Vorteil ist, dass die Unterschiede der Python-C-API zwischen den einzelnen Versionen direkt von CFFI abgefangen werden, was den Wartungsaufwand verringert.

Verwandte Artikel