ctypes Python и libspeex.dll/libspeex.so;каковы эквиваленты #define, typedef и structs?

StackOverflow https://stackoverflow.com/questions/1774383

  •  21-09-2019
  •  | 
  •  

Вопрос

У меня есть ссылка на файл dll здесь:http://speex.org/docs/api/speex-api-reference/group__Codec.html

Что мне интересно, так это то, что в этом списке много определений.Каков эквивалент Python, то же самое для класса структуры, каковы мои варианты реализации всего этого с помощью ctypes?Определения типов?

У меня относительно мало опыта работы с Python, поэтому, пожалуйста, простите меня, если мои навыки недостаточны.Здесь этому не учат ни в одном колледже, поэтому я пытаюсь учиться, спрашивая и Google.

Прямо сейчас я просто пытаюсь понять, как взаимодействовать с этой библиотекой Speex, чтобы я мог хотя бы начать использовать функции кодирования/декодирования.Но я не уверен в реализации этих трех вещей.Я уверен, что у меня это выше головы, но, в конце концов, кажется, что я всегда выхожу на первое место, изучая что-то новое.Кто-нибудь не против дать мне краткое изложение?

Насколько я понимаю, #define во всех практических целях — это просто foo = bar?
А Class:Struct SpeexMode будет классом, имеющим все перечисленные функции?

Или все это уже определено в скомпилированной DLL?Если да, то я уже выполнил небольшой вызов dll-файла с помощью ctypes с помощью учебника, с которым столкнулся.Было бы это так же просто, как настроить среду (передать эти переменные в функции для установки таких параметров, как качество кодека, вызвать кодировщик, а затем использовать его?)

Это было полезно?

Решение

Чтобы использовать структуры, вам действительно следует объявить их с помощью 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, в отличие от ctypes, требует использования компилятора C в дополнение к чистому Python.

Другие советы

По крайней мере, я разобрался со структурами и с тем, как их конвертировать.

По сути, вы просто создаете класс, передаете ему 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 и настройке, не так ли?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top