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.
Links
- Webseite: CFFI Dokumentation (englisch)
- Webseite: cffi im PyPI (englisch)