libusb-1.0的纯Python封装
项目描述
支持所有传输类型,包括同步和异步模式。
主页: http://github.com/vpelletier/python-libusb1
PyPI: http://pypi.python.org/pypi/libusb1
依赖关系
支持的操作系统
python-libusb1预期可以在以下系统上工作
安装
来自PyPI的发行版,名称为libusb1。通过命令行安装
$ pip install libusb1
来自源代码树的最新版本
$ git clone https://github.com/vpelletier/python-libusb1.git $ cd python-libusb1 $ pip install .
Windows安装说明
在Windows上,从PyPI安装wheel时,也会在usb1 Python模块中安装libusb dll。它不会安装任何驱动程序,所以你仍然需要决定每个设备使用libusbk还是WinUSB,并相应地安装它(可能使用Zadig,或者提供用户安装的驱动程序)。
从源代码树安装不会安装dll,所以你需要安装库,以便ctypes可以找到它 - 当然,还需要安装驱动程序。
检查发布文件签名
PyPI发行版已签名。要验证签名
下载发行版文件,记录其URL
通过在发行版文件URL末尾添加.asc下载其分离的签名
将发行版密钥添加到gnupg密钥环中(主仓库的KEYS文件),并使用gnupg验证签名是否与发行文件对应,并且是否受你的密钥环信任
安装已检索到的发行版文件
使用方法
查找设备和获取独占访问权限
import usb1
with usb1.USBContext() as context:
handle = context.openByVendorIDAndProductID(
VENDOR_ID,
PRODUCT_ID,
skip_on_error=True,
)
if handle is None:
# Device not present, or user is not allowed to access device.
with handle.claimInterface(INTERFACE):
# Do stuff with endpoints on claimed interface.
同步I/O
while True:
data = handle.bulkRead(ENDPOINT, BUFFER_SIZE)
# Process data...
异步I/O,具有更多错误处理
def processReceivedData(transfer):
if transfer.getStatus() != usb1.TRANSFER_COMPLETED:
# Transfer did not complete successfully, there is no data to read.
# This example does not resubmit transfers on errors. You may want
# to resubmit in some cases (timeout, ...).
return
data = transfer.getBuffer()[:transfer.getActualLength()]
# Process data...
# Resubmit transfer once data is processed.
transfer.submit()
# Build a list of transfer objects and submit them to prime the pump.
transfer_list = []
for _ in range(TRANSFER_COUNT):
transfer = handle.getTransfer()
transfer.setBulk(
usb1.ENDPOINT_IN | ENDPOINT,
BUFFER_SIZE,
callback=processReceivedData,
)
transfer.submit()
transfer_list.append(transfer)
# Loop as long as there is at least one submitted transfer.
while any(x.isSubmitted() for x in transfer_list):
try:
context.handleEvents()
except usb1.USBErrorInterrupted:
pass
更多信息,请参阅示例目录。
文档
python-libusb1的主要文档可以通过Python的标准pydoc命令访问。
python-libusb1尽可能遵循libusb-1.0文档,而不为你做出决定。因此,python-libusb1不需要重复现有的libusb1.0文档。
尽管如此,还需要一些说明,说明如何从libusb-1.0文档跳转到python-libusb1,反之亦然。
usb1模块将libusb-1.0函数作为类方法分组。第一个参数(当它是libusb_...指针时)定义了该函数所属的类。例如
int libusb_init (libusb_context **context)
成为USBContext类的构造函数,USBContext.__init__(self)
ssize_t libusb_get_device_list (libusb_context *ctx, libusb_device ***list)
成为USBContext的方法,返回USBDevice实例的列表,USBDevice.getDeviceList(self)
uint8_t libusb_get_bus_number (libusb_device *dev)
成为USBDevice的方法,USBDevice.getBusNumber(self)
错误状态被转换为usb1.USBError
异常,其中状态作为value实例属性。
usb1模块还定义了一些其他函数和类,这些在其他情况下并不便于从Python调用:异步API所需的事件处理API。
历史
0.0.1
初始发布
0.1.1
对usb1.py进行了大规模重写,使其更加Python化,并修复了一些内存泄漏。
0.1.2
废弃“transfer”构造函数参数,以允许实例重用。
0.1.3
对等时“内”传输的一些工作。它们不再引发异常,但数据有效性和Python引起的延迟影响没有得到适当的检查。
0.2.0
修复异步配置传输。
多线程应用程序的独立轮询线程。
在对象上暴露更多libusb方法,包括尚未包含在发布版本中的方法(直到其提交4630fc2)。
兼容2to3。
删除已弃用的USBDevice.reprConfigurations方法。
0.2.1
添加FreeBSD支持。
0.2.2
添加Cygwin支持。
检查OpenBSD支持(无变化)。
0.2.3
在OSX上添加fink和homebrew支持。
删除PATH_MAX定义。
在查找libusb时更加努力。
1.0.0
修复FreeBSD ABI兼容性。
更容易列出连接的设备。
更容易终止所有异步传输以实现干净退出。
修复一些段错误原因。
pypy支持。
1.1.0
描述符遍历API已记录。
公开版本和功能API。
一些可移植性修复(操作系统、Python版本)。
等时传输拒绝四舍五入传输大小。
枚举中的异常处理更好。
添加示例。
更好的文档。
1.2.0
包装热插拔API。
包装端口号API。
包装内核自动断开API。
删除libusb_strerror的包装器,并使用兼容性占位符。
添加一些新的上游枚举值。
1.3.0
向后不兼容的改变:枚举类现在影响调用者的局部作用域,而不是其全局作用域。这可能不是很重要,因为
这个类可能很少在libusb1.py之外使用
这个类可能主要在模块级别使用,其中局部变量等于全局变量。
可以通过向枚举构造函数提供新的scope_dict参数来获得以前的行为
SOME_ENUM = libusb1.Enum({...}, scope_dict=globals())
通过不导入标准inspect模块来提高CPython的启动时间。
修复一些更多的USBTransfer内存泄露。
添加Transfer.iterISO以更有效地接收等时传输。
1.3.1
修复USBContext.waitForEvent。
修复USBInterfaceSetting.getClassTuple方法名称中的拼写错误。保留向后兼容性。
从USBDeviceHandle析构函数中删除全局访问。
各种文档改进。
1.3.2
使USBDevice实例可散列。
通过从GPL v2+转移到LGPL v2.1+来放宽许可,以与libusb1保持一致。
1.4.0
通过在usb1模块中公开USBError和常量来减少(或删除)导入libusb1模块的需要。
修复libusb1.LIBUSB_ENDPOINT_ENDPOINT_MASK和libusb1.LIBUSB_ENDPOINT_DIR_MASK的命名。
修复几个USBContext方法的pydoc外观。
为每个错误值定义异常类。
1.4.1
修复轮生成(python3 setup.py bdist_wheel)。
1.5.0
controlWrite、bulkWrite和interruptWrite现在拒绝(用TypeError)data参数的数值。
修复libusb1.REQUEST_TYPE_*的命名(曾是TYPE_*)。保留向后兼容性。
添加USBContext.getDeviceIterator方法。
将USBContext.exit重命名为USBContext.close以与其他USB*类保持一致。保留向后兼容性。
使USBDeviceHandle.claimInterface成为上下文管理器,以更容易释放接口。
1.5.1
引入USBPollerThread.stop。
修复在Python 3下运行时USBDeviceHandle.getSupportedLanguageList的错误。在修复此错误时,意识到该方法返回了ctypes对象。这不是预期的,现在它返回常规整数。
1.5.2
使USBTransfer.cancel引发特定的错误实例。
1.5.3
修复1.5.2中引入的USBTransfer.cancel异常引发:它意外地成为一个绑定方法,阻止实际的引发(至少在CPython 2.x中)或在至少CPython 3.5.2中引发类型转换错误。
1.6
提高异步传输性能:(非常)次优代码用于初始化异步传输缓冲区。作为结果,usb1现在公开bytearrays,而之前它公开bytes或str对象。
弃用libusb1模块导入,因为现在不需要所有(?)需要的常量都已重新绑定到usb1模块。
将testUSB1模块移动到usb1内部,以便最终仅公开usb1作为顶级模块。
1.6.1
修复getSupportedLanguageList。
修复并扩展get{,ASCII}StringDescriptor。
修复iterISO和getISOBufferList。
1.6.2
修复getASCIIStringDescriptor:与getStringDescriptor不同,它只返回字符串描述符的有效负载,而不包括其头部。
1.6.3
弃用USBPollerThread。它误导用户认为简单版本(调用USBContext.handleEvents的线程)就足够了。对于更高级的使用(即,实际上需要轮询非libusb文件描述符),此类只与epoll:kqueue(技术上应该可以工作)在python级别上具有不同的API,而poll(在python级别上与epoll具有相同的API)缺乏在轮询已运行时更改监视文件描述符集合的关键能力,这会导致长时间的中断——如果不是死锁。
1.6.4
修复异步控制传输。
1.6.5
记录热插拔处理器的限制。
当使用python3运行setup.py时,运行2to3,并减少与python3的差异。
正确地转换libusb_set_pollfd_notifiers的参数。修复空指针值:POINTER(None)是可能为空指针的指针的类型,它回退到c_void_p。但c_void_p()是一个实际的空指针。
1.6.6
在USBDevice上公开裸字符串描述符(即字符串索引)。
1.6.7
get{,ASCII}StringDescriptor现在为描述符0返回None,而不是引发UnicodeDecodeError。使用getSupportedLanguageList访问它。
将getManufacturer、getProduct和getSerialNumber移动到USBDeviceHandle。在USBDevice上保留了这些的快捷方式。
1.7
get{,ASCII}StringDescriptor现在为描述符0返回None,使用getSupportedLanguageList获取其内容。
getManufacturer、getProduct和getSerialNumber现在位于USBDeviceHandle中,在它们原始位置有向后兼容的别名。
同步大量和中断API即使在超时发生时也会显示发送和接收的字节数。
1.7.1
usb1.__version__现在由versioneer管理。
修复在回调函数内部关闭传输时偶尔发生的段错误。
1.8
修复getExtra和libusb1.libusb_control_transfer_get_data。
修复SuperSpeed设备上的getMaxPower单位。
1.8.1
重新设计发布流程。
在Windows上嵌入libusb1 dll,以简化部署。
对发布进行加密签名。
当可用时使用libusb_free_pollfds(libusb1>=1.0.20)。
修复在上下文拆解时热插拔回调破坏的问题。
删除python 2.6支持代码的残余。
1.9
删除USBPollerThread并弃用libusb-lock相关的USBContext API。
1.9.1
修复从pypi源tarball安装时在1.8.1中损坏的问题。
1.9.2
Windows wheels:更新捆绑的libusb到1.0.24。
修复当wheel不可用时仅源构建的问题。
1.9.3
添加对pyinstaller的支持。
改进windows dlls在wheels中的嵌入方式。
修复对python 3.10的支持。
添加对Apple M1上的homebrew的支持。
1.10.1 (已撤回)
注意:版本被撤回并重新发布为2.0.0。
2.0.0
删除python <3.4支持。
在导入时不要加载C库。允许应用程序自定义查找逻辑(见usb1.loadLibrary)。
添加LIBUSB_SPEED_SUPER_PLUS。
更好地控制设备迭代器的生命周期。
修复对象从其父对象逃逸的问题。
2.0.1
修复USBContext.handleEvents中的TypeError异常。
修复USBContext.hotplugRegisterCallback中的AttributeError异常。
修复pypy3在最终化USBDevice对象时的段错误。
仅源代码:将示例转换为python3。
发布流程:还运行一些示例脚本。
3.0.0
更新versioneer以与3.11兼容。
删除python <3.6支持(versioneer更新的后果),因此进行了主要版本更改。
未发布
修复阻止使用setPollFDNotifiers的bug。
包装libusb_interrupt_event_handler,自libusb 1.0.21起可用,以帮助应用程序唤醒事件处理线程(例如,在退出期间)。
Windows 轮子:更新捆绑的 libusb dll 到 1.0.26。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。