Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ctypes: Python-Bindings ohne C-Code

ctypes: Python-Bindings ohne C-Code

Presented at µPy in Munich

Marek Kubica

June 18, 2009
Tweet

More Decks by Marek Kubica

Other Decks in Programming

Transcript

  1. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    ctypes: Python-Bindings ohne C-Code Marek Kubica µPy 18. Juni 2009 This work is licensed under the Creative Commons Attribution 3.0 License. Marek Kubica ctypes: Python-Bindings ohne C-Code
  2. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Übersicht Problemstellung Lösungsansätze Das C-Library Ökosystem 1 Das C-Library Ökosystem Übersicht Problemstellung Lösungsansätze 2 Das ctypes-Modul Informationen Vorgehen 3 Ein kleines Projekt Unique, eine kleine C-Library Der Wrapper-Code Erweiterungsmöglichkeiten 4 Weitere Informationen Marek Kubica ctypes: Python-Bindings ohne C-Code
  3. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Übersicht Problemstellung Lösungsansätze Was gibt es denn für Libraries? 1 libc 2 xlib 3 Necko 4 OpenSSL/GnuTLS 5 OpenGL 6 Cairo 7 GLib/APR 8 RSVG 9 geschätzte 1 Mio weitere Marek Kubica ctypes: Python-Bindings ohne C-Code
  4. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Übersicht Problemstellung Lösungsansätze Gründe C ist dominant Leider sind nicht alle Libraries in Python geschrieben älter als Python (xlib) Performance (GTK+) geringer Ressourcenverbrauch (libxml2) Interoperabilität Marek Kubica ctypes: Python-Bindings ohne C-Code
  5. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Übersicht Problemstellung Lösungsansätze Module Python kann durch eigene Module erweitert werden Jede Variante: reine Python-Module (“pure Python modules”) Jython: Java-Code (+ sonstige JVM-Sprachen) IronPython: C# (+ sonstige .NET-Sprachen) CPython: C und C++, über Hacks auch OCaml Marek Kubica ctypes: Python-Bindings ohne C-Code
  6. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Übersicht Problemstellung Lösungsansätze SWIG Simplified Wrapper and Interface Generator Wrapper für Python, Ruby, C#, Java, Scheme, Common Lisp, Lua, OCaml, Perl... kommt mit ANSI C komplett und ANSI C++ teilweise zurecht spezielle SWIG-Dateien müssen geschrieben werden Marek Kubica ctypes: Python-Bindings ohne C-Code
  7. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Übersicht Problemstellung Lösungsansätze Cython Python mit C gemischt Python mit C-Datentypen momentan noch ein Python-Subset Nachfolger von Pyrex verwendet um Code zu beschleunigen eignet sich auch zum Wrappen von C-Libraries (lxml, Binding für libxml2) Marek Kubica ctypes: Python-Bindings ohne C-Code
  8. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Informationen Vorgehen Das ctypes-Modul 1 Das C-Library Ökosystem Übersicht Problemstellung Lösungsansätze 2 Das ctypes-Modul Informationen Vorgehen 3 Ein kleines Projekt Unique, eine kleine C-Library Der Wrapper-Code Erweiterungsmöglichkeiten 4 Weitere Informationen Marek Kubica ctypes: Python-Bindings ohne C-Code
  9. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Informationen Vorgehen Über ctypes FFI Foreign Function Interface Zugriff auf nicht gelinkte Shared Objects (DLLs) zur Laufzeit Technik nicht neu, gibts woanders genauso funktioniert nur mit C-Libraries gut ctypes FFI-Modul für Python ab 2.3 lauffähig, ab 2.5 mitgeliefert Python 3.x-kompatibel Marek Kubica ctypes: Python-Bindings ohne C-Code
  10. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Informationen Vorgehen Vor- und Nachteile Vorteile funktioniert auf jedem Python mit ctypes kein Compiler notwendig reiner Python-Code Nachteile langsamer als natives Binding funktioniert nur mit Code, der die C-Aufrufsemantik befolgt segfaultet bei Fehlern Marek Kubica ctypes: Python-Bindings ohne C-Code
  11. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Informationen Vorgehen Üblicher Ablauf Wie wrappt man eine Library mit ctypes 1 C-Dokumentation besorgen (insbesondere auch Header) 2 C-Beispiele überfliegen 3 Datentypen definieren (struct, union) 4 Konstanten definieren 5 Libraries einbinden 6 Parametertypen und Rückgabewerte definieren 7 Funktionen aufrufen 8 optional: Aufrufe unter hübscher API kapseln Marek Kubica ctypes: Python-Bindings ohne C-Code
  12. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Unique, eine kleine C-Library Der Wrapper-Code Erweiterungsmöglichkeiten Ein kleines Projekt 1 Das C-Library Ökosystem Übersicht Problemstellung Lösungsansätze 2 Das ctypes-Modul Informationen Vorgehen 3 Ein kleines Projekt Unique, eine kleine C-Library Der Wrapper-Code Erweiterungsmöglichkeiten 4 Weitere Informationen Marek Kubica ctypes: Python-Bindings ohne C-Code
  13. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Unique, eine kleine C-Library Der Wrapper-Code Erweiterungsmöglichkeiten Was wir wrappen werden unique löst “nur ein Exemplar der Applikation soll gleichzeitig laufen”-Problem baut auf C, GLib und GTK+ auf dadurch vergleichsweise einfach zu wrappen Marek Kubica ctypes: Python-Bindings ohne C-Code
  14. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Unique, eine kleine C-Library Der Wrapper-Code Erweiterungsmöglichkeiten Library referenzieren Wie heißt die Library auf dem System? >>> import ctypes, ctypes.util >>> name = ctypes.util.find_library(’libunique-1.0’) >>> name ’libunique-1.0.so.0’ >>> # jetzt eine Referenz erstellen >>> unique = ctypes.CDLL(name) Voilà, wir haben eine C-Library eingebunden! Marek Kubica ctypes: Python-Bindings ohne C-Code
  15. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Unique, eine kleine C-Library Der Wrapper-Code Erweiterungsmöglichkeiten Libraries, Typen # die Libraries unique = ctypes.CDLL( ctypes.util.find_library(’unique-1.0’)) gobject = ctypes.CDLL( ctypes.util.find_library(’gobject-2.0’)) gtk = ctypes.CDLL( ctypes.util.find_library(’gtk-x11-2.0’)) # Typ Aliase gchar = ctypes.c_char gchar_p = ctypes.c_char_p gint = ctypes.c_int gboolean = gint gpointer = ctypes.c_void_p guint = ctypes.c_uint Marek Kubica ctypes: Python-Bindings ohne C-Code
  16. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Unique, eine kleine C-Library Der Wrapper-Code Erweiterungsmöglichkeiten Konstanten # UniqueCommand UNIQUE_INVALID = 0 UNIQUE_ACTIVATE = -1 UNIQUE_NEW = -2 UNIQUE_OPEN = -3 UNIQUE_CLOSE = -4 # UniqueResponse UNIQUE_RESPONSE_INVALID = 0 UNIQUE_RESPONSE_OK = 1 UNIQUE_RESPONSE_CANCEL = 2 UNIQUE_RESPONSE_FAIL = 3 UNIQUE_RESPONSE_PASSTHROUGH = 4 Werte aus den Headern der libunique abgeschrieben. Marek Kubica ctypes: Python-Bindings ohne C-Code
  17. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Unique, eine kleine C-Library Der Wrapper-Code Erweiterungsmöglichkeiten Parameter und Rückgabewerte # define to be gchar_p and not c_wchar_p unique.unique_app_new.argtypes = [gchar_p, gchar_p] unique.unique_app_new.restype = ctypes.c_void_p unique_app_new hat als Parameter zwei (Byte-)Strings und gibt ein UniqueApp* zurück, das wir als c_void_p, also Pointer-to-void übernehmen. Marek Kubica ctypes: Python-Bindings ohne C-Code
  18. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Unique, eine kleine C-Library Der Wrapper-Code Erweiterungsmöglichkeiten In Aktion def main(): # GTK+ initialisieren gtk.gtk_init() # registrieren app = unique.unique_app_new( ’net.xivilization.unique’, None) # nachsehen, ob es gestartet ist running = bool(unique.unique_app_is_running(app)) # Objekt entfernen gobject.g_object_unref(app) GTK+ initialisieren, Applikation registrieren, nachsehen ob sie schon läuft. Je nachdem entweder starten oder Fehlermeldung ausgeben. Marek Kubica ctypes: Python-Bindings ohne C-Code
  19. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Unique, eine kleine C-Library Der Wrapper-Code Erweiterungsmöglichkeiten Weitere Features von Unique Unique und ctypes können noch mehr Nachrichten an gestartete Applikationen schicken die GTK+ Mainloop starten und Events verarbeiten Marek Kubica ctypes: Python-Bindings ohne C-Code
  20. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Unique, eine kleine C-Library Der Wrapper-Code Erweiterungsmöglichkeiten Probleme Es gibt auch ein paar Probleme beim Starten der Mainloop hört ˆC auf zu funktionieren mögliche Probleme mit PyGTK Marek Kubica ctypes: Python-Bindings ohne C-Code
  21. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Weitere Informationen 1 Das C-Library Ökosystem Übersicht Problemstellung Lösungsansätze 2 Das ctypes-Modul Informationen Vorgehen 3 Ein kleines Projekt Unique, eine kleine C-Library Der Wrapper-Code Erweiterungsmöglichkeiten 4 Weitere Informationen Marek Kubica ctypes: Python-Bindings ohne C-Code
  22. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Dokumentation ctypes ist dokumentiert Stdlib-Dokumentation: 48 A4-Seiten Tutorials im Internet Quelltexte von PyOpenGL, dem TRE-Binding für Python, etc. Marek Kubica ctypes: Python-Bindings ohne C-Code
  23. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Die Sprache C Falls es doch ein wenig mehr Kenntnisse braucht... C Ressourcen The C Programming Language, bekannt als K&R: das C-Lehrbuch schlechthin C in a Nutshell: Ein Überblick über C. Marek Kubica ctypes: Python-Bindings ohne C-Code
  24. Das C-Library Ökosystem Das ctypes-Modul Ein kleines Projekt Weitere Informationen

    Credits Code & Ideen birkenfeld, fred.reichbier, Trundle CC-NC-SA lizensierte Bilder von flickr mwichary, munaz, nostri-imago, SOCIALisBETTER, purrr, benjibot, fncll, wooandy, kurafire, lexnger, bionicteaching, t0msk Danke, das war’s! Marek Kubica ctypes: Python-Bindings ohne C-Code