在Python中查询连接的USB设备信息的简单方法?

Bla*_*ine 27 python usb libusb

我们如何在Python中查询连接的USB设备信息?我想获得UID设备名称(例如:SonyEricsson W660),设备路径(例如:/ dev/ttyACM0)

还有什么是上述信息中最好的参数,用于识别设备何时再次连接?(UID?)

我正在研究Ubuntu 11.04.

ATM我有这个代码(使用pyUSB)

busses = usb.busses()
for bus in busses:
  devices = bus.devices
  for dev in devices:
    print repr(dev)
    print "Device:", dev.filename
    print "  idVendor: %d (0x%04x)" % (dev.idVendor, dev.idVendor)
    print "  idProduct: %d (0x%04x)" % (dev.idProduct, dev.idProduct)
    print "Manufacturer:", dev.iManufacturer
    print "Serial:", dev.iSerialNumber
    print "Product:", dev.iProduct
Run Code Online (Sandbox Code Playgroud)

问题是我没有得到所需的输出,会粘贴一个例子:

<usb.legacy.Device object at 0x1653990>
Device: 
  idVendor: 4046 (0x0fce)
  idProduct: 53411 (0xd0a3)
Manufacturer: 1
Serial: 3
Product: 2
Run Code Online (Sandbox Code Playgroud)

首先我没有文件名,这对我来说最重要.我假设它是/ dev/ttyACM0等部分.其次,我猜每个USB设备都有一些UID,或者我应该同时使用Vendor或Product id?

编辑:显然我有一些设置问题,我想我使用错误的USB库.(使用libusb0.1)ATM.这就是我将Device(dev.filename)字符串设为空的原因.如果有人可以请告诉他在什么操作系统上他正在使用什么USB库以及我认为它将解决我的问题的哪个版本的PyUSB.

mes*_*n10 47

我可以想到像这样的快速代码.

由于可以通过/ dev/bus/usb/<bus>/<device>访问所有USB端口

对于生成的ID,即使您拔下设备并重新连接它[可能是其他端口].它会是一样的.

import re
import subprocess
device_re = re.compile("Bus\s+(?P<bus>\d+)\s+Device\s+(?P<device>\d+).+ID\s(?P<id>\w+:\w+)\s(?P<tag>.+)$", re.I)
df = subprocess.check_output("lsusb")
devices = []
for i in df.split('\n'):
    if i:
        info = device_re.match(i)
        if info:
            dinfo = info.groupdict()
            dinfo['device'] = '/dev/bus/usb/%s/%s' % (dinfo.pop('bus'), dinfo.pop('device'))
            devices.append(dinfo)
print devices
Run Code Online (Sandbox Code Playgroud)

此处的示例输出将是:

[
{'device': '/dev/bus/usb/001/009', 'tag': 'Apple, Inc. Optical USB Mouse [Mitsumi]', 'id': '05ac:0304'},
{'device': '/dev/bus/usb/001/001', 'tag': 'Linux Foundation 2.0 root hub', 'id': '1d6b:0002'},
{'device': '/dev/bus/usb/001/002', 'tag': 'Intel Corp. Integrated Rate Matching Hub', 'id': '8087:0020'},
{'device': '/dev/bus/usb/001/004', 'tag': 'Microdia ', 'id': '0c45:641d'}
]
Run Code Online (Sandbox Code Playgroud)

  • 在Windows中,我尝试过你的代码,但不支持lsusb。我遇到了这个问题,你能帮我解决 lsusb 问题吗? (3认同)

joa*_*uin 36

如果您正在使用Windows,则可以使用pywin32.

我在这里找到了一个例子:

import win32com.client

wmi = win32com.client.GetObject ("winmgmts:")
for usb in wmi.InstancesOf ("Win32_USBHub"):
    print usb.DeviceID
Run Code Online (Sandbox Code Playgroud)


fyn*_*yrz 5

对于旧版 USB 回归和 libusb-1.0 的系统,此方法将有助于检索各种实际字符串。我以供应商和产品为例。它可能会导致一些 I/O,因为它实际上从设备读取信息(至少是第一次)。某些设备不提供此信息,因此在这种情况下假设它们会抛出异常;没关系,所以我们通过了。

import usb.core
import usb.backend.libusb1

busses = usb.busses()
for bus in busses:
    devices = bus.devices
    for dev in devices:
        if dev != None:
            try:
                xdev = usb.core.find(idVendor=dev.idVendor, idProduct=dev.idProduct)
                if xdev._manufacturer is None:
                    xdev._manufacturer = usb.util.get_string(xdev, xdev.iManufacturer)
                if xdev._product is None:
                    xdev._product = usb.util.get_string(xdev, xdev.iProduct)
                stx = '%6d %6d: '+str(xdev._manufacturer).strip()+' = '+str(xdev._product).strip()
                print stx % (dev.idVendor,dev.idProduct)
            except:
                pass
Run Code Online (Sandbox Code Playgroud)