【问题标题】:Python ctypes & libspeex.dll/libspeex.so; what are the equivilents to #define, typedef, and structs?Python ctypes & libspeex.dll/libspeex.so; #define、typedef 和结构的等价物是什么?
【发布时间】:2010-12-18 23:09:21
【问题描述】:

我在这里有 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 文件调用。会不会像设置环境一样简单(将这些变量传递给函数来设置诸如编解码器质量之类的东西,调用编码器,然后使用编码器?)

【问题讨论】:

    标签: python c api ctypes speex


    【解决方案1】:

    要使用结构,你确实应该使用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 编译器甚至看不到它们(定义通过预处理器)。

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

    【讨论】:

    • 感谢您提供此示例! -- 这真的帮助我理解了结构是如何工作的! - 我不知道你以后可以通过将它们分配给一个变量然后能够执行 [variable].[field] 来调用它们——这是 INVALUABLE。
    • 另外——我真的认为我现在更喜欢使用 ctypes,因为这意味着以后我可以拖放我的 DLL 的新版本,而且我可以将 dll 从可执行文件中解压缩。稍后我可以通过发送一个新的 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 和设置中定义的,不是吗?

    【讨论】:

      猜你喜欢
      • 2012-06-29
      • 2018-08-21
      • 2011-01-20
      • 1970-01-01
      • 2011-09-03
      • 2011-03-07
      • 2019-06-17
      • 2011-05-31
      • 2021-06-19
      相关资源
      最近更新 更多