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

时间:2009-11-21 03:20:01

标签: python c api ctypes speex

我在这里有一个dll文件的引用: http://speex.org/docs/api/speex-api-reference/group__Codec.html

我想知道的是,在该列表中,有很多定义。什么是python等价物,对于struct类来说,使用ctypes实现所有这些的选择是什么?类型定义

我对python缺乏经验,所以如果我的技能不够,请原谅我。没有大学在这里教它,所以我试图通过询问和学习来学习谷歌。

现在我只是想弄清楚如何与这个speex库接口,这样我至少可以开始使用编码/解码功能了。但我不确定这三件事的执行情况。我相信我已经超过了我的头脑,但最终似乎我总是站出来学习新的东西。有人介意给我一个简短的纲要吗?

从我所看到的#define在所有实际用途中基本上只是foo = bar?
和Class:Struct SpeexMode将是一个具有所有列出函数的类?

或者已经在编译的DLL中定义了所有这些?如果是这样,我已经通过我跑过的教程用ctypes做了一个小的dll文件调用。它是否像设置环境一样简单(将这些变量传递给函数以设置编解码器质量,调用编码器,然后使用编码器?)

2 个答案:

答案 0 :(得分: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
>>>

至于定义,它们通常是include文件的一部分,所以你只需要在Python代码中自己定义它们,因为C编译器甚至看不到它们(定义被转换为它们的值预处理器)。

如果您正在寻找从C / C ++接口到Python的更自动转换器,请查看SWIG。与ctypes不同,SWIG要求您使用除纯Python之外的C编译器。

答案 1 :(得分: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和设置中定义的,不是吗?