Windows:puede extraer información USB de WMI, pero debe ser administrador. Los ejemplos están en .NET, pero debería poder usar el módulo Python WMI. Esto le dará acceso a cadenas de identificación USB, que pueden contener información útil. Para los dispositivos seriales FTDI, existe un atajo usando la DLL de FTDI, que no requiere acceso privilegiado.
Linux:toda la información disponible está bajo /sys/bus/usb
, y también disponible a través de udev. Esto parece una buena respuesta.
Sé que esta es una publicación anterior, pero tuve problemas hoy. Finalmente, utilicé la biblioteca wmi para python ya que estoy en una máquina con Windows (lo siento, sé que mi respuesta solo se aplica a Windows, pero tal vez ayude alguien).
Instale el paquete usando pip primero:
pip install wmi
entonces
import wmi
c = wmi.WMI()
wql = "Select * From Win32_USBControllerDevice"
for item in c.query(wql):
print item.Dependent.Caption
Debería dar como resultado algo como:
Coneccion casera para el USB
Coneccion casera para el USB
Puerto de comunicación prolífico de USB a serie (COM9)Hub raíz USB
Coneccion casera para el USB
Dispositivo compuesto USB
Dispositivo de video USBDispositivo de audio USB
Coneccion casera para el USB
...cortar...
En este caso, tendría que analizar en cadena el título para encontrar el puerto COM. También puede echar un vistazo solo al artículo. Objeto dependiente para ver otros atributos del dispositivo USB junto al Título que puede encontrar relevante:
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";
};
Con respecto a Linux, si todo lo que necesita es enumerar dispositivos, puede incluso omitir la dependencia de pyudev para su proyecto y simplemente analizar la salida de /sbin/udevadm info --export-db
comando (no requiere privilegios de root). Volcará toda la información sobre los dispositivos y clases actuales, incluidos los ID de productos USB para dispositivos USB, que deberían ser más que suficientes para identificar sus adaptadores de USB a serie. Por supuesto, también puedes hacer esto con pyudev.
Al menos para Linux, puede usar algunos trucos ficticios para determinar su nodo /dev, inspeccionando, por ejemplo, la salida de "ls /dev | grep ttyUSB" antes y después de conectar su dispositivo. Esto de alguna manera debe aplicarse también para el caso de OSX. Una buena idea es inspeccionar esos comandos usando algo como el comando subprocess.Popen(). En cuanto a Windows, esto podría ser útil.