在Python中获取友好的设备名称

11 投票
6 回答
10266 浏览
提问于 2025-04-17 03:04

我有一个2口信号继电器,通过USB串口接口连接到我的电脑。使用pyserial这个模块,我可以很轻松地控制这些继电器。不过,这个方法是建立在我事先知道设备被分配到哪个COM端口(或者在Linux上是/dev节点)的基础上。

但对于我正在做的项目来说,这还不够,因为我不想假设设备总是被分配到比如说Windows上的COM7。我需要能够在不同的平台上(Windows、Linux、OSX(我想这和Linux的方式类似))用Python来识别这个设备。也许可以像标题所说的那样,列出系统上的USB设备,并以某种方式获取它们更友好的名称。Windows和Linux是我最想支持的平台。

任何帮助都会非常感激!

编辑:
看起来pyudev模块对于Linux系统来说是个不错的选择。有没有人有过这方面的经验?

6 个回答

2

在Windows系统上,你可以通过WMI来获取USB的信息,不过你需要有管理员权限。虽然示例代码是用.NET写的,但你也可以使用Python的WMI模块。这样你就能获取USB的识别字符串,这里面可能包含一些有用的信息。对于FTDI串口设备,还有一个简单的方法可以使用FTDI的DLL,这样就不需要特别的权限了。

在Linux系统上,所有可用的信息都在/sys/bus/usb目录下,也可以通过udev来获取。这个回答看起来不错

5

我知道这是一篇旧帖子,但今天我遇到了一些问题,想分享一下我的解决方法。

最后我使用了Python的wmi库,因为我是在Windows电脑上(抱歉,我知道我的答案只适用于Windows,但希望能帮到某些人)。

首先,使用pip安装这个库:

pip install wmi

然后

import wmi
c = wmi.WMI()
wql = "Select * From Win32_USBControllerDevice"
for item in c.query(wql):
    print item.Dependent.Caption

这样应该会得到类似下面的结果:

USB根集线器
USB根集线器
Prolific USB转串口通信端口(COM9)
USB根集线器
USB根集线器
USB复合设备
USB视频设备
USB音频设备
USB根集线器
...省略...

在这种情况下,你需要解析Caption字符串来找到COM端口。你也可以查看这个项目的依赖对象,看看USB设备除了Caption之外的其他属性,这些可能对你有用:

instance of Win32_PnPEntity
{
    Caption = "USB Root Hub";
    ClassGuid = "{36fc9e60-c465-11cf-8056-444553540000}";
    ConfigManagerErrorCode = 0;
    ConfigManagerUserConfig = FALSE;
    CreationClassName = "Win32_PnPEntity";
    Description = "USB Root Hub";
    DeviceID = "USB\\ROOT_HUB\\4&32F13EF0&1";
    HardwareID = {"USB\\ROOT_HUB&VID8086&PID3A36&REV0000",     
                "USB\\ROOT_HUB&VID8086&PID3A36", "USB\\ROOT_HUB"};
    Manufacturer = "(Standard USB Host Controller)";
    Name = "USB Root Hub";
    PNPDeviceID = "USB\\ROOT_HUB\\4&32F13EF0&1";
    Service = "usbhub";
    Status = "OK";
    SystemCreationClassName = "Win32_ComputerSystem";
    SystemName = "001fbc0934d1";
};
7

关于Linux,如果你只是想列出设备,其实可以不需要使用pyudev这个库。你只需要解析一下命令/sbin/udevadm info --export-db的输出结果就行了(这个命令不需要管理员权限)。它会显示所有当前设备和类别的信息,包括USB设备的产品ID,这些信息足够你识别你的USB转串口适配器了。当然,你也可以选择使用pyudev来完成这个任务。

撰写回答