如何仅获取 linux 中所有插入设备的 USB ID

How to get just USB IDs of all plugged in devices in linux

我正在尝试制作一个 Python 脚本,该脚本 运行 在后台运行并检查所有插入设备的 USB ID,看它是否与识别的 ID 列表相匹配。这将是 运行 在 Linux 环境中,最好是 Python 2.x

我知道在 linux 中我可以 运行 lsusb 在 shell 或 运行 中通过 os.system() 这将给我这个输出:

Bus 003 Device 009: ID 046d:c534 Logitech, Inc. Unifying Receiver
Bus 003 Device 007: ID 046d:082b Logitech, Inc. Webcam C170
Bus 003 Device 005: ID 1532:0043 Razer USA, Ltd 
Bus 003 Device 010: ID 05e3:0608 Genesys Logic, Inc. Hub
Bus 003 Device 008: ID 05e3:0608 Genesys Logic, Inc. Hub
Bus 003 Device 006: ID 0424:2137 Standard Microsystems Corp. 
Bus 003 Device 004: ID 0451:8044 Texas Instruments, Inc. 

但是,正如您所看到的,returns 提供的信息比我需要的多,过滤这些信息会很困难,而且会花费更多时间。我需要的是这样的:

046d:c534
046d:082b
1532:0043
05e3:0608
05e3:0608
0424:2137
0451:8044

为了让这个脚本尽可能快,有什么方法可以 运行 向系统发出命令并仅取回所有插入的 USB ID,或者使用 grep 或 Python 中的类似内容以某种方式过滤它?

提前致谢!

这会解决您的问题吗?

guru@dileant:~$ lsusb
Bus 002 Device 002: ID 8087:8001 Intel Corp. 
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 005 Device 003: ID 2687:fb01  
Bus 005 Device 002: ID 0a5c:21e8 Broadcom Corp. BCM20702A0 Bluetooth 4.0
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:8009 Intel Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

以下解决方案使用 sed(流编辑器)仅打印输出的相关部分。该程序使用 perl-like 语法进行字符串替换。因此,命令行通常采用以下形式:sed <flags> 's/<find>/<replace>/g'.

最后,sed 使用 \( \) 表示正则表达式组。当您想要保留输入模式的某些部分时,您可以使用正则表达式组。

因此,如果您想要总线和设备编号,您可以这样做:

guru@dileant:~$ lsusb | sed -e 's/Bus \([0-9]\+\) Device \([0-9]\+\).*/:/g'
002:002
002:001
006:001
005:003
005:002
005:001
001:002
001:001

同样,如果您想要供应商和产品 ID,您可以这样做:

guru@dileant:~$ lsusb | sed -e 's/.*ID \([a-f0-9]\+:[a-f0-9]\+\).*//g'
8087:8001
1d6b:0002
1d6b:0003
2687:fb01  
0a5c:21e8
1d6b:0002
8087:8009
1d6b:0002

PyUSB 具有您需要的功能以及更多。

您可以使用以下代码(兼容Python2和Python3)枚举当前连接的所有设备:

import usb.core
for dev in usb.core.find(find_all=True):
  print("%0.4X:%0.4X" % (dev.idVendor, dev.idProduct))

dev 对象将具有 VID、PID 和所有其他设备属性。 示例输出:

046D:C016
413C:2107
8087:0024

他们还有一个 tutorial,如果有人想与 USB 设备交互