在Python中访问HIDAPI库

5 投票
1 回答
3894 浏览
提问于 2025-04-16 15:08

我正在尝试用Python与一个通用的HID设备进行通信。

我了解到,HIDAPI这个用C语言写的库在简单和稳定的跨平台HID通信方面比libusb1.0更好。不过,没有人详细说明如何在Python脚本中调用HIDAPI的函数,这就是我遇到的问题所在。

我对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分支的C文件中):

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

其中的'...'是一大堆操作系统级别的代码,最终返回“一个指向类型为struct #hid_device的链表的指针,里面包含关于HID设备的信息”。

那么,如何使用ctypes或者其他工具在Python脚本中调用这样的函数呢?我希望这个StackOverflow页面能为所有想解决同样问题的人提供指导,所以请详细说明,谢谢。

1 个回答

3

这不是你问题的确切答案,但可能会给你一些新的思路。

当你需要和复杂的本地库打交道时,可能需要写一些C语言的代码来“搭桥”,单靠ctypes可能不够用。这个桥接代码会在把数据传给Python之前,先简化C语言的结构,反之亦然,因为你可能无法用ctypes描述本地代码的所有细节。

你可以手动编写本地Python的C扩展,但这并不推荐。

在这种情况下,有几个“桥接工具包”或代码生成器可以使用。其中一个最受欢迎的就是Cython,它允许你编写.pyx模块,在这里你可以自由地混合C和Python代码。

http://cython.org/

.pyx文件会被编译成本地C模块和一个包装的.py模块。你可以很方便地将后者导入到你的应用逻辑中。

撰写回答