2012-10-07 8 views
7

Ich habe eine schlecht entworfene und große (> 300 public functions, >200 numeric constants definiert mit #define in der Header-Datei), die ich in Python umbrechen muss. Ich habe die dll und die h Datei. Die Bibliothek wird jährlich aktualisiert, bis jetzt rückwärtskompatibel (d. H. Nur Funktionen wurden hinzugefügt, eine Konstante behält ihre numerischen Werte usw.). Aber ich habe keine Garantien, da ich die Bibliothek nicht kontrolliere.Wartbarkeit einer Python-Umhüllung einer C-Bibliothek

Mit ctypes, sehe ich zwei Möglichkeiten, dies in Python Verpackung:

  1. jede Konstante und Funktion Python Mapping, 1 bis 1
  2. die API in Python neu definieren und Tätigen von Anrufen in die Bibliothek .

Das erste in einer (in etwa) automatisch aus der Header-Datei durchgeführt werden kann und daher leichter zu pflegen und zu aktualisieren, erfordert die zweite viel Python-Code, aber es wird einfacher zu bedienen sein.

Ich würde einige Meinungen aufgrund Ihrer Erfahrung mit dieser Art von Problem und einigen Beispielen schätzen.

+0

Sorry aber so gut wie das ist, es ist nicht wirklich eine klare Frage. –

+3

Werfen Sie einen Blick auf SWIG. –

+0

[SIP] (http://pypi.python.org/pypi/SIP/4.14) kann eine interessante Lösung sein. –

Antwort

4

Ich habe vor kurzem ctypesgen verwendet, um eine Ctypes Wrapping für SDL und ergänzende Bibliotheken (SDL_image, SDL_ttf, SDL_mixer) zu erstellen.

Für mich funktionierte es ziemlich gut. Es erzeugt Python 2.x, aber ich war in der Lage, den gewünschten 3.x-Code mit dem "2to3" -Dienstprogramm zu bekommen.

Ich denke, es ist eine gute Idee, die Ctypes Wrapping als Grundlage für eine mehr "Pythonic" API zu verwenden, und das ist im Grunde, was ich (auf einer sehr einfachen Ebene) mit meinem pslab Modul.

Also, wenn Sie etwas Ähnliches machen möchten, wäre das eine Möglichkeit.

0

Die Pflege einer Python-Bibliothek mit einem Ctypes-Backend ist kein unüberschaubarer Ansatz. Offensichtlich ist die Anfangsinvestition größer als die Verwendung automatisierter Tools, aber die API, die Ihnen zur Verfügung steht, sollte viel besser sein.

Wenn Sie diesen Weg gehen, zielen Sie jedoch darauf ab, die Python-API vollständig von der C-Bibliothek zu trennen. Die Unterstützung mehrerer Ctypes-Backends mit einem Python-Front-End-API ist nicht allzu schlecht - einfach zur Laufzeit abfragen und das korrekte Ctypes-Wrapper-Modul dynamisch laden. Ich habe das getan, um verschiedene DLL-Dateien und .so-Dateien für Windows und Linux zu umhüllen, aber es würde auch für Versionen einer Bibliothek funktionieren.

Verwandte Themen