Python ctypes 和 libspeex.dll/libspeex.so:#define、typedef 和 structs 的等价物是什么?
我这里有一个dll文件的参考链接:http://speex.org/docs/api/speex-api-reference/group__Codec.html
我想知道的是,在那个列表里,有很多定义。那么在Python中对应的是什么?还有结构体类,我该如何用ctypes来实现这些?typedefs又是什么?
我对Python还比较陌生,请多包涵,如果我的技能不够好。这里没有大学教这个,所以我只能通过提问和谷歌来学习。
现在我主要想弄清楚如何与这个speex库进行交互,这样我至少可以开始使用编码和解码的功能。但我对这三样东西的实现不太确定。我知道这可能对我来说有点难,但最终我总能学到新东西。有人能给我简单讲讲吗?
从我的理解来看,#define在实际操作中基本上就是foo = bar?
而Class:Struct SpeexMode会是一个类,里面包含所有列出的函数吗?
还是说这些已经在编译好的DLL里定义好了?如果是这样,我之前通过一个教程已经用ctypes做过一个小的dll文件调用。那设置环境是不是就简单得多了(把这些变量传递给函数来设置像编解码质量这样的东西,调用编码器,然后使用编码器)?
2 个回答
我至少搞明白了结构体是怎么回事,以及怎么基本上把它们转换过来。
其实你只需要创建一个类,传入ctypes.Structure,然后定义你的字段数组。
像这样:
class PASSWD(ctypes.Structure):
_fields_ = [("name", ctypes.c_char_p),
("passwd", ctypes.c_char_p),
("uid", ctypes.c_int),
("gid", ctypes.c_int),
("change", ctypes.c_long),
("class", ctypes.c_char_p),
("gecos", ctypes.c_char_p),
("dir", ctypes.c_char_p),
("shell", ctypes.c_char_p),
("expire", ctypes.c_long),
("fields", ctypes.c_int) ]
不过我不太确定我是否真的需要把这些都设置好。我觉得它们在DLL里应该已经定义和设置好了,对吧?
要使用结构体,你确实需要用 ctypes.Structure
来声明它们,这样Python才能知道它们的存在。
>>> from ctypes import *
>>> class POINT(Structure):
... _fields_ = [("x", c_int),
... ("y", c_int)]
...
>>> point = POINT(10, 20)
>>> print point.x, point.y
10 20
>>> point = POINT(y=5)
>>> print point.x, point.y
0 5
>>> POINT(1, 2, 3)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ValueError: too many initializers
>>>
至于定义(defines),它们通常是在包含文件里,所以你需要在Python代码里自己定义,因为C编译器根本看不到这些定义(定义会被预处理器转换成它们的值)。
如果你想要一个更自动化的工具,把C/C++的接口转换成Python,可以看看 SWIG。与 ctypes
不同,SWIG需要你使用C编译器,而不仅仅是纯Python。