用Python列出可用的COM端口

我正在寻找一个简单的方法来列出一台PC上所有可用的COM端口。

我发现这个方法,但它是特定于Windows : 在Windows上列出串行(COM)端口?

我在一个Win7(Windows 7)个人电脑上使用python的python 3。

我在pyserial API( http://pyserial.sourceforge.net/pyserial_api.html )中find了一个函数serial.tools.list_ports.comports(),它列出了com端口(正是我想要的)。

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

但似乎它不能正常工作。

当我的USB到COM网关连接到PC(我在设备pipe理器中看到COM5),我没有这个COM端口。 我只是COM4这似乎是连接到调制解调器(我没有看到它在设备pipe理器的COM&LPT部分!!)

你知道为什么它不起作用吗? 你有没有系统特定的另一个解决scheme?

谢谢

这是我使用的代码。

成功地在Windows 8.1 x64,Windows 10 x64,Mac OS X 10.9.x / 10.10.x / 10.11.x和Ubuntu 14.04 / 14.10 / 15.04 / 15.10上同时testing了Python 2和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()) 

您可以使用:

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

通过知道端口进行过滤: python -c "import serial.tools.list_ports;print [port for port in serial.tools.list_ports.comports() if port[2] != 'n/a']"

在这里查看更多信息: https : //pyserial.readthedocs.org/en/latest/tools.html#module-serial.tools.list_ports

托马斯的优秀答案的一个可能的改进是让Linux和可能的OSX也尝试打开端口,只返回那些可以打开的端口。 这是因为Linux至less将一堆端口列为/ dev /中的文件,这些文件并没有连接任何东西。 如果你在一个terminal上运行,/ dev / tty是你正在工作的terminal,打开和closures它可能导致你的命令行,所以globdevise不这么做。 码:

  # ... 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 

托马斯代码的这一修改已经在Ubuntu 14.04上进行了testing。

有几个选项可用:

用NULL lpDeviceName调用QueryDosDevice来列出所有的DOS设备。 然后使用每个设备名称的CreateFile和GetCommConfig来判断它是否是串口。

使用GUID_DEVINTERFACE_COMPORT的ClassGuid调用SetupDiGetClassDevs。

WMI也可用于C / C ++程序 。

在win32新闻组和一个CodeProject呃项目上有一些对话。

细化moylop260的答案:

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

这列出了硬件中存在的端口,包括正在使用的端口。 根据pyserial工具文档 ,列表中存在更多的信息