1

我在这里有 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 文件调用。是否像设置环境一样简单(将这些变量传递给函数以设置编解码器质量等内容,调用编码器,然后使用编码器?)

4

2 回答 2

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
>>>

至于定义,它们通常是包含文件的一部分,因此您只需要在 Python 代码中自己定义它们,因为 C 编译器甚至看不到它们(定义由 pre-处理器)。

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

于 2009-11-21T06:31:24.153 回答
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 和设置中定义,不是吗?

于 2009-11-21T04:48:59.010 回答