You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 00:42:21