我正在尝试制作一个在后台运行的Python脚本,并检查所有插入设备的USB ID,看它是否与识别的ID列表匹配。这将在Linux环境中运行,最好是Python 2.x
我知道在linux中我可以在shell中运行lsusb
或通过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.
但是,正如您所看到的,这会返回比我需要的信息更多的信息,并且过滤这将很困难并且需要更多时间。我需要的是这样的东西:
046d:c534
046d:082b
1532:0043
05e3:0608
05e3:0608
0424:2137
0451:8044
为了尽可能快地保持这个脚本,我是否可以通过某种方式向系统运行命令并只返回插入的所有内容的USB ID,或使用grep
或类似的东西在Python中以某种方式过滤它?
提前致谢!
答案 0 :(得分:1)
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
如果想要与USB设备进行交互,他们还会获得tutorial
答案 1 :(得分:0)
这会解决您的问题吗?
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的语法来进行字符串替换。因此,命令行通常具有以下形式:sed <flags> 's/<find>/<replace>/g'
。
最后,sed
使用\( \)
来表示正则表达式组。如果要保留输入模式的某些部分,可以使用正则表达式组。
因此,如果你想要总线和设备号码,你可以这样做:
guru@dileant:~$ lsusb | sed -e 's/Bus \([0-9]\+\) Device \([0-9]\+\).*/\1:\2/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]\+\).*/\1/g'
8087:8001
1d6b:0002
1d6b:0003
2687:fb01
0a5c:21e8
1d6b:0002
8087:8009
1d6b:0002