Windows的PyUSB问题

问题描述

Pyusb在我的PC上无法正常工作。在这个论坛上没有关于我的问题的话题。详细信息如下。 我正在尝试运行一个简单的脚本,该脚本应显示USB设备信息:

import usb.core
import usb.util
for device in usb.core.find(find_all=True):
    print(device)

然后我收到2个错误 usb.core.USBError:[错误2]找不到实体 NotImplementedError:该平台不支持或未实现操作

日志

 DEVICE ID 8087:8008 on Bus 001 Address 003 =================
 bLength                :   0x12 (18 bytes)
 bDescriptorType        :    0x1 Device
 bcdUSB                 :  0x200 USB 2.0
 bDeviceClass           :    0x9 Hub
 bDeviceSubClass        :    0x0
 bDeviceProtocol        :    0x1
 bMaxPacketSize0        :   0x40 (64 bytes)
 idvendor               : 0x8087
 idProduct              : 0x8008
 bcdDevice              :    0x5 Device 0.05
 iManufacturer          :    0x0
 iProduct               :    0x0
 iSerialNumber          :    0x0
 bNumConfigurations     :    0x1
  CONfigURATION 1: 0 mA ====================================
   bLength              :    0x9 (9 bytes)
   bDescriptorType      :    0x2 Configuration
   wTotalLength         :   0x19 (25 bytes)
   bNumInterfaces       :    0x1
   bConfigurationValue  :    0x1
   iConfiguration       :    0x0
   bmAttributes         :   0xe0 Self Powered,Remote Wakeup
   bMaxPower            :    0x0 (0 mA)
    INTERFACE 0: Hub =======================================
     bLength            :    0x9 (9 bytes)
     bDescriptorType    :    0x4 Interface
     bInterfaceNumber   :    0x0
     bAlternateSetting  :    0x0
     bNumEndpoints      :    0x1
     bInterfaceClass    :    0x9 Hub
     bInterfaceSubClass :    0x0
     bInterfaceProtocol :    0x0
     iInterface         :    0x0
      ENDPOINT 0x81: Interrupt IN ==========================
       bLength          :    0x7 (7 bytes)
       bDescriptorType  :    0x5 Endpoint
       bEndpointAddress :   0x81 IN
       bmAttributes     :    0x3 Interrupt
       wMaxPacketSize   :    0x1 (1 bytes)
       bInterval        :    0xc
DEVICE ID 1c4f:0026 on Bus 003 Address 001 =================
 bLength                :   0x12 (18 bytes)
 bDescriptorType        :    0x1 Device
 bcdUSB                 :  0x110 USB 1.1
 bDeviceClass           :    0x0 Specified at interface
 bDeviceSubClass        :    0x0
 bDeviceProtocol        :    0x0
 bMaxPacketSize0        :    0x8 (8 bytes)
 idvendor               : 0x1c4f
 idProduct              : 0x0026
 bcdDevice              :  0x110 Device 1.1
 iManufacturer          :    0x1 Error Accessing String
 iProduct               :    0x2 Error Accessing String
 iSerialNumber          :    0x0
 bNumConfigurations     :    0x1
  CONfigURATION 1: 98 mA ===================================
   bLength              :    0x9 (9 bytes)
   bDescriptorType      :    0x2 Configuration
   wTotalLength         :   0x3b (59 bytes)
   bNumInterfaces       :    0x2
   bConfigurationValue  :    0x1
   iConfiguration       :    0x0
   bmAttributes         :   0xa0 Bus Powered,Remote Wakeup
   bMaxPower            :   0x31 (98 mA)
    INTERFACE 0: Human Interface Device ====================
     bLength            :    0x9 (9 bytes)
     bDescriptorType    :    0x4 Interface
     bInterfaceNumber   :    0x0
     bAlternateSetting  :    0x0
     bNumEndpoints      :    0x1
     bInterfaceClass    :    0x3 Human Interface Device
     bInterfaceSubClass :    0x1
     bInterfaceProtocol :    0x1
     iInterface         :    0x0
      ENDPOINT 0x81: Interrupt IN ==========================
       bLength          :    0x7 (7 bytes)
       bDescriptorType  :    0x5 Endpoint
       bEndpointAddress :   0x81 IN
       bmAttributes     :    0x3 Interrupt
       wMaxPacketSize   :    0x8 (8 bytes)
       bInterval        :    0xa
    INTERFACE 1: Human Interface Device ====================
     bLength            :    0x9 (9 bytes)
     bDescriptorType    :    0x4 Interface
     bInterfaceNumber   :    0x1
     bAlternateSetting  :    0x0
     bNumEndpoints      :    0x1
     bInterfaceClass    :    0x3 Human Interface Device
     bInterfaceSubClass :    0x0
     bInterfaceProtocol :    0x0
     iInterface         :    0x0
      ENDPOINT 0x82: Interrupt IN ==========================
       bLength          :    0x7 (7 bytes)
       bDescriptorType  :    0x5 Endpoint
       bEndpointAddress :   0x82 IN
       bmAttributes     :    0x3 Interrupt
       wMaxPacketSize   :    0x3 (3 bytes)
       bInterval        :    0xa
Traceback (most recent call last):
  File "f:\newpy\venv\lib\site-packages\usb\core.py",line 746,in __str__
    for configuration in self:
  File "f:\newpy\venv\lib\site-packages\usb\core.py",line 1128,in __iter__
    yield Configuration(self,i)
  File "f:\newpy\venv\lib\site-packages\usb\core.py",line 603,in __init__
    desc = backend.get_configuration_descriptor(
  File "f:\newpy\venv\lib\site-packages\usb\backend\libusb1.py",line 773,in get_configuration_descriptor
    _check(self.lib.libusb_get_config_descriptor(
  File "f:\newpy\venv\lib\site-packages\usb\backend\libusb1.py",line 604,in _check
    raise USBError(_strerror(ret),ret,_libusb_errno[ret])
usb.core.USBError: [Errno 2] Entity not found
During handling of the above exception,another exception occurred:
Traceback (most recent call last):
  File "usbtesta.py",line 31,in <module>
    print(device)
  File "f:\newpy\venv\lib\site-packages\usb\core.py",line 750,in __str__
    configuration = self.get_active_configuration()
  File "f:\newpy\venv\lib\site-packages\usb\core.py",line 909,in get_active_configuration
    return self._ctx.get_active_configuration(self)
  File "f:\newpy\venv\lib\site-packages\usb\core.py",line 113,in wrapper
    return f(self,*args,**kwargs)
  File "f:\newpy\venv\lib\site-packages\usb\core.py",line 247,in get_active_configuration
    self.managed_open()
  File "f:\newpy\venv\lib\site-packages\usb\core.py",line 131,in managed_open
    self.handle = self.backend.open_device(self.dev)
  File "f:\newpy\venv\lib\site-packages\usb\backend\libusb1.py",line 804,in open_device
    return _DeviceHandle(dev)
  File "f:\newpy\venv\lib\site-packages\usb\backend\libusb1.py",line 652,in __init__
    _check(_lib.libusb_open(self.devid,byref(self.handle)))
  File "f:\newpy\venv\lib\site-packages\usb\backend\libusb1.py",line 600,in _check
    raise NotImplementedError(_strerror(ret))
NotImplementedError: Operation not supported or unimplemented on this platform

我在互联网上看到了类似的问题,但是在使用特定的USB设备时遇到了麻烦,可以通过安装Zadig并选择正确的驱动程序来解决。这样对我没有帮助,因为我不使用某些USB设备,而只使用试图查看设备列表的代码。问题不在PATH中。 我尝试使用以下配置运行脚本:win10,python 3.8.5,以及3.7.9,pyusb 1.1.0,libusb 1.0.23b1 / libusb-win32。 如果我使用libusb-win32(libusb0.dll)运行脚本,则什么也没有发生,python只是返回一个空行并等待新命令。如果我使用libusb运行脚本,则python将在本文上方显示这些错误。当我添加到脚本行set_configuration()

时,第一个错误消失
for device in usb.core.find(find_all=True):
    print(device)
    device.set_configuration()

但是如何解决第二个错误? 在Mac OS(pyusb,libusb 1.0,python 3.7.9)的相同配置中,该脚本成功运行

screen_mac

奇怪的是,此脚本运行成功:

for device in usb.core.find(find_all=True):
    print(device.bDeviceClass) # running only if i indicate parameter of variable "device" like here

奇怪的是,pyusb找到了一些USB设备(如您在日志中看到的),但最后出现了错误。在另一台我的脚本根本没有运行的PC上,启动后立即出现错误。 那么如何查看已连接设备的列表?我很高兴得到任何帮助

解决方法

enter image description result  here

    import sys
    import ctypes as ct
    import libusb as usb
    
    
    def print_devs(devs):
    
        path = (ct.c_uint8 * 8)()
    
        i = 0
        while devs[i]:
            dev = devs[i]
    
            desc = usb.device_descriptor()
            r = usb.get_device_descriptor(dev,ct.byref(desc))
            if r < 0:
                print("failed to get device descriptor",file=sys.stderr)
                return
    
            print("{:04x}:{:04x} (bus {:d},device {:d})".format(
                  desc.idVendor,desc.idProduct,usb.get_bus_number(dev),usb.get_device_address(dev)),end="")
    
            r = usb.get_port_numbers(dev,path,ct.sizeof(path))
            if r > 0:
                print(" path: {:d}".format(path[0]),end="")
                for j in range(1,r):
                    print(".{:d}".format(path[j]),end="")
    
            print()
            i += 1
    
    
    def main():
    
        r = usb.init(None)
        if r < 0:
            return r
    
        try:
            devs = ct.POINTER(ct.POINTER(usb.device))()
            cnt = usb.get_device_list(None,ct.byref(devs))
            if cnt < 0:
                return cnt
    
            print_devs(devs)
    
            usb.free_device_list(devs,1)
        finally:
            usb.exit(None)
    
        return 0
    
    
    sys.exit(main() or 0)