我的设计很差,并且在头文件中定义了> 300 public functions
,>200 numeric constants
#define
,我必须用Python包装。我有dll
和h
文件。该库每年更新一次,直到现在以向后兼容的方式更新(即仅添加功能,保持其数值的常数等)。但我无法保证,因为我无法控制图书馆。
使用ctypes
,我看到了两种在Python中包装它的方法:
- 将每个常量和函数映射到python,1到1
- 在Python中重新定义API并调用库。
醇>
第一个可以从(大致)自动的方式从头文件完成,因此更容易维护和升级,第二个需要很多python代码,但它将更容易使用。
根据您对此类问题的经验和一些示例,我将不胜感激。
答案 0 :(得分:4)
我最近使用ctypesgen为SDL和互补库(SDL_image,SDL_ttf,SDL_mixer)创建了一个ctypes包装。
对我来说,它运作得相当好。它生成Python 2.x,但我能够通过使用“2to3”实用程序获得所需的3.x代码。
我认为使用ctypes包装作为更“pythonic”api的基础是个好主意,这基本上就是我用pslab模块做的(在一个非常简单的层面上)。
所以,如果你想做类似的事情,这将是一种方式。
答案 1 :(得分:0)
维护带有ctypes后端的Python库并不是一种难以管理的方法。显然,最初的投资比使用自动化工具要大,但您留下的API应该更好。
如果您确实采用了这种方法,那么可以将Python API完全与C库分开。使用一个Python前端api支持多个ctypes后端也不错 - 只需在运行时查询并动态加载正确的ctypes包装器模块。我已经完成了为Windows和Linux包装不同的dll文件和.so文件,但它也适用于库的版本。