7

我有一个设计不佳且很大的 ( > 300 public functions,在头文件中>200 numeric constants定义#define),我必须用 Python 包装。我有dllh文件。该库每年更新一次,直到现在以向后兼容的方式(即只添加了函数,常量保持它们的数值等)。但我不能保证,因为我不控制图书馆。

使用ctypes,我看到了两种在 Python 中包装它的方法:

  1. 将每个常量和函数映射到 python,1 到 1
  2. 在 Python 中重新定义 API 并调用库。

第一个可以从头文件以(大致)自动方式完成,因此更易于维护和升级,第二个需要大量 python 代码,但更易于使用。

根据您对此类问题的经验和一些示例,我将不胜感激。

4

2 回答 2

4

我最近使用ctypesgen为 SDL 和补充库(SDL_image、SDL_ttf、SDL_mixer)创建了一个 ctypes 包装。

对我来说,它运作得相当好。它生成 Python 2.x,但我能够通过使用“2to3”实用程序获得所需的 3.x 代码。

我认为使用 ctypes 包装作为更“pythonic” api 的基础是一个好主意,这基本上就是我对pslab模块所做的(在非常简单的层面上)。

所以,如果你想做类似的事情,那将是一种方法。

于 2012-10-08T12:48:52.477 回答
0

使用 ctypes 后端维护 Python 库并不是一种难以管理的方法。显然,初始投资比使用自动化工具要大,但你剩下的 API 应该会好得多。

如果您确实采取了这条路线,那么目标是将 Python API 与 C 库完全分开。使用一个 Python 前端 api 支持多个 ctypes 后端并不算太糟糕 - 只需在运行时查询并动态加载正确的 ctypes 包装器模块。我这样做是为了为 windows 和 linux 包装不同的 dll 文件和 .so 文件,但它也适用于库的版本。

于 2012-10-21T10:12:20.633 回答