Python ctypes 和 libspeex.dll/libspeex.so:#define、typedef 和 structs 的等价物是什么?

1 投票
2 回答
536 浏览
提问于 2025-04-15 16:13

我这里有一个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 个回答

0

我至少搞明白了结构体是怎么回事,以及怎么基本上把它们转换过来。

其实你只需要创建一个类,传入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里应该已经定义和设置好了,对吧?

2

要使用结构体,你确实需要用 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。

撰写回答