Ctypes

2.025 Aufrufe

Veröffentlicht am

TechTalk von Steven Mohr (27.01.2009)

Veröffentlicht in: Technologie
0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Keine Downloads
Aufrufe
Aufrufe insgesamt
2.025
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
9
Aktionen
Geteilt
0
Downloads
0
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie
  • Ctypes

    1. 1. ctypes from C import * Steven Mohr <steven.mohr@dlr.de> TechTalk, DLR Köln, 27. Januar 2009
    2. 2. Gliederung <ul><li>Was ist CTypes ? </li></ul><ul><li>Libraries </li></ul><ul><li>Datentypen </li></ul><ul><ul><li>Einfache Datentypen </li></ul></ul><ul><ul><li>Pointer </li></ul></ul><ul><ul><li>Arrays </li></ul></ul><ul><ul><li>Strukturierte Datentypen </li></ul></ul><ul><li>Funktionen </li></ul><ul><li>Automatische Codegenerierung </li></ul><ul><li>Quellen </li></ul>
    3. 3. 1. Was ist ctypes? <ul><li>Erlaubt es C-Bibliotheken zu laden und zu benutzen (Foreign function interface) </li></ul><ul><li>Erstellung „C-kompatibler“ Pythonobjekte </li></ul><ul><li>Gehört zur Python-Standardbibliothek </li></ul>
    4. 4. 2. Bibliotheken <ul><li>Laden der Bibliotheken: </li></ul><ul><li>Erstellen eines CDLL oder WinDLL-Objektes </li></ul><ul><li>libc = cdll.LoadLibrary(„libc.so.6“) </li></ul><ul><li>libc = CDLL(„libc.so.6“) </li></ul><ul><li>Art des Ladens: </li></ul><ul><li>now: alle Symbole werden sofort aufgelöst </li></ul><ul><li>lazy: alle Symbole werden bei Bedarf aufgelöst </li></ul><ul><li>global: die Symbole stehen zur Auflösung von Symbolen anderer Bibliotheken bereit </li></ul><ul><li>local: die Symbole stehen nicht zur Auflösung bereit </li></ul>
    5. 5. 3. Datentypen
    6. 6. 3.1 Einfache Datentypen <ul><li>ctypes bietet Objekte für alle C-Standarddatentypen </li></ul><ul><li>Bespiele: </li></ul>Python-Typ C-Typ ctypes Datentyp float float c_float int unsigned int c_uint int short c_short 1-character string char c_char
    7. 7. 3.2 Pointer <ul><li>Erzeugung von Pointern: </li></ul><ul><li>Mittels der pointer-Funktion </li></ul><ul><li>i = c_int(42) </li></ul><ul><li>pi = pointer(i) </li></ul><ul><li>Zugriff auf Werte: </li></ul><ul><li>>>> pi.contents </li></ul><ul><li>c_int(42) </li></ul><ul><li>Ändern der Referenz: </li></ul><ul><li>>>> pi.contents = c_int(60) </li></ul><ul><li>>>> pi.contents </li></ul><ul><li>c_int(42) </li></ul>
    8. 8. 3.3 Arrays <ul><li>Arraytyp erzeugen: </li></ul><ul><li>FiveIntArray = c_int * 5 </li></ul><ul><li>Instanzierung: </li></ul><ul><li>array1 = FiveIntArray() </li></ul><ul><li>array2 = FiveIntArray(1, 2, 3, 4, 5) </li></ul><ul><li>Zugriff: </li></ul><ul><li>>>> array1[2] </li></ul><ul><li>0 </li></ul><ul><li>>>> array2[2] </li></ul><ul><li>3 </li></ul>
    9. 9. 3.4 Strukturierte Datentypen <ul><li>ctypes stellt Union und Structure als Objekte zur Verfügung </li></ul><ul><li>Alle C-Strukturen erben hiervon </li></ul><ul><li>Aufbau der Struktur wird in Attribut _fields_ bestimmt => Liste von 2-Tupeln mit Name und Typ </li></ul><ul><li>Einfache Initialisierung: Constructor weist übergebene Werte der Reihe nach zu oder direkte Angabe als Key-Value-Paar </li></ul><ul><li>>>> from ctypes import * </li></ul><ul><li>>>> class POINT(Structure): </li></ul><ul><li>... _fields_ = [(&quot;x&quot;, c_int), (&quot;y&quot;, c_int)] </li></ul><ul><li>>>> point = POINT(10, 20) </li></ul><ul><li>>>> print point.x, point.y </li></ul><ul><li>10 20 </li></ul>
    10. 10. 4. Funktionen <ul><li>Zugriff auf Funktionen: </li></ul><ul><li>Funktionen sind Elemente des Bibliotheken-Objektes </li></ul><ul><li>libc.printf(„Ich bin eine C-Funktion“) </li></ul><ul><li>None, integers, longs, byte strings und unicode strings können direkt an C-Funktionen übergeben werden </li></ul><ul><li>Übergabe von Parametern: </li></ul><ul><li>Python- oder ctypes-Objekte </li></ul><ul><li>By reference: Pointer-Objekt oder über byref() </li></ul><ul><li>Über das Attribut argtypes können die erlaubten Übergabewerte gesetzt werden </li></ul>
    11. 11. 4. Funktionen <ul><li>Rückgabewerte: </li></ul><ul><li>Standard: int </li></ul><ul><li>Sonst: Setzen über das Attribut restype des Funktionsobjektes </li></ul><ul><li>restype kann auch eine Pythonfunktion sein </li></ul><ul><li>Bedingung: eigentlicher Rückgabewert: Integer </li></ul><ul><li>Funktionen mit Pythonobjekten aufrufen: </li></ul><ul><li>Ctypes sucht ein Atrribut namens _as_parameter_ und nutzt dieses </li></ul>
    12. 12. 5. Automatische Codegenerierung <ul><li>CTypesLib mit GCCXML </li></ul><ul><li>2 Skripte: h2xml.py und xml2py.py </li></ul><ul><li>Generieren das Python-Wrappermodul </li></ul><ul><li>Python-orientierte Wrapper sind vielfach sinnvoll </li></ul><ul><li>Nachteile: </li></ul><ul><li>CTypesLib stark an einzelne GCCXML-Versionen gekoppelt </li></ul><ul><li>Konfiguration dieser Toolchain sehr komplex bzw. undurchsichtig </li></ul><ul><li>alledings: CTypesLib noch in der Entwicklung, frühes Stadium </li></ul>
    13. 13. 6. Quellen <ul><li>ctypes-Doku: http://docs.python.org/library/ctypes.html#module-ctypes </li></ul><ul><li>Guy K. Kloß: Automatic C Library Wrapping - Ctypes from the Trenches </li></ul><ul><li>The Python Papers, Vol. 3, No. 3 (2008) http://ojs.pythonpapers.org/index.php/tpp/issue/view/10 </li></ul>

    ×