在Python中为C库创建封装器

6 投票
5 回答
6942 浏览
提问于 2025-04-15 11:36

我正在尝试为FLAC创建一个自己的封装,这样我就可以在自己的Python代码中使用FLAC。

我最开始试着用ctypes,但它给我展示了一个很奇怪的库接口,比如说,所有用于FLAC流和文件的初始化函数都变成了一个函数,而且没有真正的信息告诉我怎么初始化。尤其是,它需要一个流解码器的引用,但Python没有办法存储指针(BZZZT!),所以我无法存储流解码器的指针。更麻烦的是,不同的初始化函数需要的参数数量不同,有些参数类型也不一样。还有很多枚举和结构体,我不知道怎么把这些放到我的代码里。

我也在研究Pyrex,但我遇到了类似的指针问题,不过我觉得我有点解决了。这个文件也不小,而且还不完整。

所以我在寻找其他的选择,或者一些能帮助我更好理解上述方法的指南。如果能得到推荐或者帮助,那就太好了。

5 个回答

4

但是Python没有办法存储指针(错误!)

这个说法是不对的。你可以这样创建一个指针:

pInt = POINTER(c_int)()

然后你可以这样访问它

pInt[0] # or p.contents
5

你有没有看过 http://www.swig.org/ 呢?

SWIG 是一个软件开发工具,它可以把用 C 和 C++ 写的程序和多种高级编程语言连接起来。

11

Python没有办法存储指针,所以我不能存储流解码器的指针。

ctypes可以使用指针,并且可以用来包装现有的C语言库。这里有个小提示,你需要把所有相关的C结构重新包装成ctypes.Structure。可以看看这些例子: code.google.com/p/pyxlib-ctypescode.google.com/p/pycairo-ctypes。更多关于如何映射函数/过程及其 argtypesrestype 的信息,可以查看 http://docs.python.org/library/ctypes.html

我在研究Pyrex,但我也遇到了指针的问题,不过我想我有点解决了。这个文件也不小,而且还没有完成。

cython可能是你需要的,如果你想要更简洁的语法。 www.cython.org

所以我在寻找其他的替代方案,或者一些能帮助我更好理解上述方法的指南。如果能得到推荐和帮助,那就太好了。

swig也是一个选择,但如果你不熟悉的话,它会比较复杂。 www.swig.org

撰写回答