Windows의 PyUSB 문제
Pyusb가 내 PC에서 제대로 작동하지 않습니다. 이 포럼에는 내 문제에 대한 주제가 없습니다. 아래 세부 정보. USB 장치 정보를 표시하는 간단한 스크립트를 실행하려고합니다.
import usb.core
import usb.util
for device in usb.core.find(find_all=True):
print(device)
그 후 두 가지 오류가 발생합니다. usb.core.USBError : [Errno 2] Entity not found 및 NotImplementedError : Operation not supported or unimplemented on this platform
로그
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 113, in wrapper
return f(self, *args, **kwargs)
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)로 스크립트를 실행하면 아무 일도 일어나지 않으면 파이썬은 빈 줄을 반환하고 새 명령을 기다립니다. libusb로 스크립트를 실행하면 파이썬은이 게시물에서 위의 오류를 표시합니다. 스크립트 줄 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)의 동일한 구성에서이 스크립트는 성공적으로 실행됩니다.
이상하게도이 스크립트가 성공적으로 실행 중입니다.
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에서는 시작 직후 오류가 나타납니다. 그렇다면 연결된 장치 목록을 어떻게 볼 수 있습니까? 도움을받을 수있어 기쁩니다
답변
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)