ctypes Python и libspeex.dll/libspeex.so;каковы эквиваленты #define, typedef и structs?
Вопрос
У меня есть ссылка на файл 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 и настройке, не так ли?