我在这里有一个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文件调用。它是否像设置环境一样简单(将这些变量传递给函数以设置编解码器质量,调用编码器,然后使用编码器?)
答案 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和设置中定义的,不是吗?