Доступ к библиотеке HIDAPI на python

#python #usb #ctypes #hid

#python #usb #ctypes #hid

Вопрос:

Я пытаюсь использовать python для связи с универсальным устройством HID.

Я читал, что библиотека HIDAPI, написанная на C, превосходит libusb1.0 по простоте и стабильности кроссплатформенного взаимодействия HID. Однако никто никогда не удосуживался показать, как вызывать функции HIDAPI из скрипта python, и именно здесь у меня возникают проблемы.

Я понимаю достаточно ctypes для вызова действительно простых функций C, таких как:

 int add(int n1, int n2) {
    return n1   n2;
    }
  

Проблема в том, что функции HIDAPI более сложны, например (в заголовочном файле HIDAPI):

 struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id);
  

который указывает на эту структуру (в файле Mac branch C):

 struct hid_device_info  HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id)
{
...
}
  

где ‘…’ — это множество кода на уровне операционной системы, который в конечном итоге возвращает «указатель на связанный список типа struct #hid_device, содержащий информацию о скрытом устройстве»

Как бы вы отнеслись к использованию ctypes или любого другого инструмента для вызова подобной функции в скрипте python? Я надеюсь, что эта страница stackoverflow послужит руководством для всех других людей, которые хотели бы решить ту же проблему, поэтому, пожалуйста, расскажите побольше подробностей, спасибо.

Ответ №1:

Это не точные ответы на ваш вопрос, но может дать некоторые новые указания.

При взаимодействии со сложными собственными библиотеками вам, вероятно, потребуется написать некоторый код на C, чтобы «устранить пробел», и одни ctypes могут его не устранить. Код моста упрощает структуры C перед передачей их в Python и наоборот, поскольку вы, возможно, не сможете описать все тонкости машинного кода с помощью ctypes.

Вы можете написать собственное расширение Python C вручную, но это не рекомендуется.

Существует несколько «bridge toolkits» или генераторов кода, которые вы можете использовать в подобных ситуациях. Одним из самых популярных является Cython, которому вы разрешаете писать модули .pyx, в которых вы можете свободно смешивать код на C и Python.

http://cython.org/

затем .pyx компилируется в результирующий собственный модуль C и модуль wrapping .py. Вы можете легко импортировать последнюю в логику вашего приложения.