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

man*_*ama 11 python linux windows macos

我有一个2端口信号继电器通过USB串行接口连接到我的电脑.使用pyserial模块,我可以轻松控制这些继电器.但是,这是基于我事先知道设备分配给哪个COM端口(或/ dev-node)的假设.

对于我正在做的项目,这是不够的,因为我不想假设设备总是被分配给例如Windows中的COM7.我需要能够使用python在可能的平台(Win,Linux,OSX(我想这将类似于Linux方法))上以编程方式识别设备.或许正如标题所示,在系统中枚举USB设备并以某种方式获得更友好的名称.Windows和Linux是最重要的支持平台.

任何帮助将不胜感激!

编辑:
似乎pyudev模块非常适合Linux系统.有没有人有过这方面的经验?

abb*_*bot 7

关于Linux,如果您只需要枚举设备,您甚至可以跳过项目的pyudev依赖关系,并简单地解析/sbin/udevadm info --export-db命令的输出(不需要root权限).它将转储有关当前设备和类的所有信息,包括USB设备的USB产品ID,这些信息应足以识别USB到串行适配器.当然,你也可以用pyudev做到这一点.


小智 5

我知道这是一个较旧的帖子,但我今天正在努力解决它。最终,我在 Windows 机器上使用了 python 的 wmi 库(抱歉,我知道我的答案仅适用于 Windows,但也许它会帮助某人)。

首先使用 pip 安装包:

pip install wmi
Run Code Online (Sandbox Code Playgroud)

然后

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

结果应该是这样的:

USB Root Hub
USB Root Hub
Prolific USB-to-Serial Comm Port (COM9) USB Root Hub
USB Root Hub
USB Composite Device
USB Video Device USB Audio Device
USB Root Hub
...snip...

在这种情况下,您必须对 Caption 进行字符串解析才能找到 COM 端口。您也可以只查看项目。用于查看除 Caption 之外的 USB 设备的其他相关属性的相关对象:

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";
};
Run Code Online (Sandbox Code Playgroud)