跳至主要内容

libusb-1.0的纯Python封装

项目描述

支持所有传输类型,包括同步和异步模式。

主页: http://github.com/vpelletier/python-libusb1

PyPI: http://pypi.python.org/pypi/libusb1

依赖关系

  • CPython 3.6+, pypy 2.0+. 较旧版本可能也能工作,但并不推荐,因为没有为它们设置自动回归测试。

  • libusb-1.0

支持的操作系统

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,而之前它公开bytesstr对象。

弃用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。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

libusb1-3.1.0.tar.gz (83.0 kB 查看散列)

上传时间 源代码

构建发行版

libusb1-3.1.0-py3-none-win_amd64.whl (140.4 kB 查看散列)

上传时间 Python 3 Windows x86-64

libusb1-3.1.0-py3-none-win32.whl (127.8 kB 查看散列)

上传时间 Python 3 Windows x86

libusb1-3.1.0-py3-none-any.whl (62.4 kB 查看散列)

上传时间 Python 3

支持者