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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide