Maintainability of a python wrapping of a C library
I have a poorly designed and big ( > 300 public functions
, >200 numeric constants
defined with #define
in the header file) that I have to wrap in Python. I have the dll
and the h
file. The library is updated yearly, till now in a backwards compatible way (ie just functions were added, a constant keep their numerical values, etc). But I have no guarantees as I do not control the library.
Using ctypes
, I see two ways of wrapping this in Python:
The first can be done in a (roughly) automatic way from the header file and therefore is easier to maintain and upgrade, the second requires a lot of python code but it will be easier to use.
I would appreciate some opinions based on your experience with this type of problem and some examples.
I recently used ctypesgen to create a ctypes wrapping for SDL, and complementary libraries (SDL_image, SDL_ttf, SDL_mixer).
For me, it worked fairly well. It generates Python 2.x, but I was able to get the desired 3.x code by using the "2to3" utility.
I think it's a good idea to use the ctypes wrapping as a foundation for a more "pythonic" api, and that's basically what I did (on a very simple level) with my pslab module.
So, if you're looking to do something similar, that would be one way.
Maintaining a Python library with a ctypes backend isn't an unmanageable approach. Obviously the initial investment is larger than using automated tools, but the API you are left with should be much better.
If you do take that route, aim to separate the Python API entirely from the C library though. Supporting multiple ctypes backends with one Python front end api isn't too bad - just query at runtime and dynamically load the correct ctypes wrapper module. I've done that to wrap different dll files and .so files for windows and linux but it would work for versions of a library as well.
链接地址: http://www.djcxy.com/p/64478.html上一篇: 我在哪里可以获得版本16.0.0的libmpreetype.6.dylib MAMP上的ImageMagick
下一篇: 一个C库的python包装的可维护性