在Python中访问HIDAPI库
我正在尝试用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代码。
.pyx文件会被编译成本地C模块和一个包装的.py模块。你可以很方便地将后者导入到你的应用逻辑中。