2012-10-07 13 views
7

Mam źle zaprojektowane i duże (> 300 public functions, >200 numeric constants zdefiniowane z #define w pliku nagłówkowym), które muszę zawinąć w Pythonie. Mam plik dll i h. Biblioteka jest aktualizowana co roku, dotychczas w sposób kompatybilny wstecz (tj. Dodano tylko funkcje, stała zachowuje ich wartości liczbowe, itp.). Ale nie mam żadnych gwarancji, ponieważ nie kontroluję biblioteki.Utrzymywanie pakowania w python biblioteki C

Korzystanie ctypes, widzę dwa sposoby zawijania to w Pythonie:

  1. Mapping każdą stałą i funkcji do Python, 1 do 1
  2. Redefiniowanie API w Pythonie i wykonywanie połączeń do biblioteki .

Pierwszy można zrobić w (w przybliżeniu) sposób automatyczny z pliku nagłówka i dlatego jest łatwiejsza do utrzymania i modernizacji, drugi wymaga dużo kodu Pythona, ale to będzie łatwiejszy w obsłudze.

Chciałbym docenić niektóre opinie na podstawie doświadczeń z tego typu problemem i kilka przykładów.

+0

Przepraszam, ale tak dobre, jak to jest, to naprawdę nie jest jasne pytanie. –

+3

Spójrz na SWIG. –

+0

[SIP] (http://pypi.python.org/pypi/SIP/4.14) może być interesującym rozwiązaniem. –

Odpowiedz

4

Ostatnio użyłem ctypesgen do utworzenia zawijania ctypes dla SDL i bibliotek komplementarnych (SDL_image, SDL_ttf, SDL_mixer).

Dla mnie działało całkiem dobrze. Generuje Python 2.x, ale udało mi się uzyskać pożądany kod 3.x za pomocą narzędzia "2to3".

Myślę, że dobrym pomysłem jest użycie zawijania ctypes jako podstawy dla bardziej "pythonic" api, i to jest zasadniczo to, co zrobiłem (na bardzo prostym poziomie) z moim modułem pslab.

Tak więc, jeśli szukasz czegoś podobnego, byłby to jeden sposób.

0

Utrzymywanie biblioteki Pythona za pomocą funkcji backendu typu ctypes nie jest podejściem nie do zarządzania. Oczywiście początkowa inwestycja jest większa niż zautomatyzowane narzędzia, ale interfejs API, z którym masz pozostać, powinien być znacznie lepszy.

Jeśli jednak skorzystasz z tej trasy, staraj się całkowicie oddzielić API Pythona od biblioteki C. Obsługa wielu podpunktów ctypes z jednym api interfejsu API w języku Python nie jest zła - wystarczy zapytanie w środowisku wykonawczym i dynamiczne ładowanie właściwego modułu opakowania typu ctypes. Zrobiłem to, aby owijać różne pliki dll i pliki .so dla Windows i Linuksa, ale działałoby również dla wersji biblioteki.

Powiązane problemy