如何在Python脚本中使用pySerial列出可用串口(非命令行方式)
报错原因
仅通过import serial导入pySerial主模块时,不会自动加载serial.tools下的子模块,因此直接访问serial.tools.list_ports会触发AttributeError: module 'serial' has no attribute 'tools'报错。
正确实现方式
不需要调用外部shell命令,pySerial原生提供了脚本可直接调用的串口枚举API,使用前显式导入serial.tools.list_ports子模块即可。
基础串口枚举示例
list_ports.comports()是核心枚举函数,会返回当前系统所有可用串口的信息列表,每个列表元素为ListPortInfo对象,包含串口路径、设备描述、硬件ID、USB VID/PID等可用于设备匹配的属性:
import serial # 显式导入list_ports子模块 from serial.tools import list_ports # 遍历所有可用串口 for port in list_ports.comports(): # port.device 对应命令行输出的串口路径,比如 /dev/cu.XXXX print(f"串口路径: {port.device}, 设备描述: {port.description}, 硬件标识: {port.hwid}")
匹配目标设备+自动连接完整示例
你可以根据自己设备的特征做匹配,比如匹配USB设备的VID/PID,或者匹配设备描述里的关键字,找到目标串口后直接建立连接即可:
import serial from serial.tools import list_ports # 替换成你自己目标设备的匹配规则,这里以匹配指定VID/PID的USB串口为例 TARGET_VID = 0x2341 # 示例为Arduino官方VID,替换成你设备的对应值 TARGET_PID = 0x0043 # 示例为Arduino Uno的PID,替换成你设备的对应值 target_serial_path = None # 遍历所有串口排查目标设备 for port in list_ports.comports(): # 也可以改成描述关键字匹配,比如 if "你的设备名关键字" in port.description if port.vid == TARGET_VID and port.pid == TARGET_PID: target_serial_path = port.device break if target_serial_path: # 找到目标设备,建立串口连接 ser = serial.Serial( port=target_serial_path, baudrate=115200, # 替换成你设备的波特率 timeout=1 ) print(f"目标设备连接成功,使用串口:{target_serial_path}") # 后续串口读写逻辑在此处编写 else: print("未检测到目标串口设备,请检查设备连接状态")
注:你之前使用的
python -m serial.tools.list_ports命令行工具,内部本质也是调用list_ports.comports()实现枚举输出,直接在代码里调用API的方式和命令行逻辑完全一致,没有冗余开销。
内容的提问来源于stack exchange,提问作者beyarkay
相关产品推荐
相关产品推荐

