Listado de puertos com disponibles con Python

Estoy buscando un método simple para enumerar todos los puertos com disponibles en una PC.

He encontrado este método pero es específico de Windows: ¿ Listado de puertos serie (COM) en Windows?

Estoy usando Python 3 con pySerial en una PC con Windows 7.

He encontrado en la API de pySerial ( http://pyserial.sourceforge.net/pyserial_api.html ) una función serial.tools.list_ports.comports() que enumera los puertos com (exactamente lo que quiero).

 import serial.tools.list_ports print(list(serial.tools.list_ports.comports())) 

Pero parece que no funciona. Cuando mi puerta de enlace USB a COM está conectada a la PC (veo el COM5 en el Administrador de dispositivos), este puerto COM no está incluido en la lista devuelta por list_ports.comports() . En su lugar, solo obtengo COM4 que parece estar conectado a un módem (no lo veo en la sección COM y LPT del Administrador de dispositivos).

¿Sabes por qué no funciona? ¿Tienes otra solución que no sea específica del sistema?

Este es el código que uso.

Probado con éxito en Windows 8.1 x64, Windows 10 x64, Mac OS X 10.9.x / 10.10.x / 10.11.x y Ubuntu 14.04 / 14.10 / 15.04 / 15.10 con Python 2 y Python 3.

 import sys import glob import serial def serial_ports(): """ Lists serial port names :raises EnvironmentError: On unsupported or unknown platforms :returns: A list of the serial ports available on the system """ if sys.platform.startswith('win'): ports = ['COM%s' % (i + 1) for i in range(256)] elif sys.platform.startswith('linux') or sys.platform.startswith('cygwin'): # this excludes your current terminal "/dev/tty" ports = glob.glob('/dev/tty[A-Za-z]*') elif sys.platform.startswith('darwin'): ports = glob.glob('/dev/tty.*') else: raise EnvironmentError('Unsupported platform') result = [] for port in ports: try: s = serial.Serial(port) s.close() result.append(port) except (OSError, serial.SerialException): pass return result if __name__ == '__main__': print(serial_ports()) 

Puedes usar:

python -c "import serial.tools.list_ports;print serial.tools.list_ports.comports()"

Filtrar por puerto conocido: python -c "import serial.tools.list_ports;print [port for port in serial.tools.list_ports.comports() if port[2] != 'n/a']"

Ver más información aquí: https://pyserial.readthedocs.org/en/latest/tools.html#module-serial.tools.list_ports

Un posible refinamiento de la excelente respuesta de Thomas es que Linux y posiblemente OSX también intenten abrir puertos y devolver solo aquellos que podrían abrirse. Esto se debe a que Linux, al menos, lista una gran cantidad de puertos como archivos en / dev / que no están conectados a nada. Si está ejecutando en un terminal, / dev / tty es el terminal en el que está trabajando y abrirlo y cerrarlo puede mejorar su línea de comandos, por lo que el globo está diseñado para no hacer eso. Código:

  # ... Windows code unchanged ... elif sys.platform.startswith ('linux'): temp_list = glob.glob ('/dev/tty[A-Za-z]*') result = [] for a_port in temp_list: try: s = serial.Serial(a_port) s.close() result.append(a_port) except serial.SerialException: pass return result 

Esta modificación del código de Thomas se ha probado en Ubuntu 14.04 solamente.

refinamiento en la respuesta de moylop260 :

 import serial.tools.list_ports comlist = serial.tools.list_ports.comports() connected = [] for element in comlist: connected.append(element.device) print("Connected COM ports: " + str(connected)) 

Esto enumera los puertos que existen en el hardware, incluidos los que están en uso. Existe mucha más información en la lista, según la documentación de herramientas de pyserial.

Básicamente lo mencioné en la documentación de pisario https://pyserial.readthedocs.io/en/latest/tools.html#module-serial.tools.list_ports

 import serial.tools.list_ports ports = serial.tools.list_ports.comports() for port, desc, hwid in sorted(ports): print("{}: {} [{}]".format(port, desc, hwid)) 

Resultado:

COM1: Puerto de comunicaciones (COM1) [ACPI \ PNP0501 \ 1]

COM7: Puerto USB MediaTek (COM7) [USB VID: PID = 0E8D: 0003 SER = 6 UBICACIÓN = 1-2.1]

Varias opciones están disponibles:

Llame a QueryDosDevice con un lpDeviceName NULL para enumerar todos los dispositivos DOS. Luego, use CreateFile y GetCommConfig con cada nombre de dispositivo para averiguar si se trata de un puerto serie.

Llame a SetupDiGetClassDevs con un ClassGuid de GUID_DEVINTERFACE_COMPORT.

WMI también está disponible para los progtwigs C / C ++ .

Hay una conversación sobre el grupo de noticias win32 y un proyecto de CodeProject, er.

Solución de una línea con paquete pySerial.

 python -m serial.tools.list_ports 

Por favor, intente este código:

 import serial ports = serial.tools.list_ports.comports(include_links=False) for port in ports : print(port.device) 

En primer lugar, debe importar el paquete para la comunicación del puerto serie, por lo que:

 import serial 

A continuación, crea la lista de todos los puertos serie disponibles actualmente:

 ports = serial.tools.list_ports.comports(include_links=False) 

y luego, recorriendo toda la lista, puede, por ejemplo, imprimir nombres de puertos:

 for port in ports : print(port.device) 

Este es solo un ejemplo de cómo obtener la lista de puertos e imprimir sus nombres, pero hay otras opciones que puede hacer con estos datos. Solo intente imprimir diferentes variantes despues

Puerto.