使用pySerial时IDLE调用serial.tools报AttributeError的原因
原因说明
- pySerial 的
serial.tools属于二级子模块,不会在仅导入根模块serial时被默认自动加载,仅执行import serial时无法直接访问未导入的下层子模块属性。 - CMD 中执行
python -m serial.tools.list_ports时,-m参数会按照输入的完整模块路径逐层导入所有层级模块:先导入serial,再导入serial.tools,最后导入serial.tools.list_ports并作为脚本运行,因此运行时tools子模块已经被加载,可正常访问。 - IDLE 中仅执行
import serial没有触发子模块的导入逻辑,所以访问serial.tools会抛出AttributeError错误。
解决方法
如果要在 IDLE 或者普通 Python 脚本中使用 list_ports 相关功能,直接显式导入对应的子模块即可:
# 显式导入 tools 下的 list_ports 子模块 import serial.tools.list_ports # 此时可正常访问子模块下的所有内容 # 示例:列举所有可用COM端口 print(serial.tools.list_ports.comports()) # 访问你提到的 list_ports_common 模块也正常 print(serial.tools.list_ports_common)
额外排查点
如果显式导入子模块后仍然报错,可确认 IDLE 使用的 Python 解释器和 CMD 中执行的 Python 属于同一个环境,避免因多环境共存导致 pySerial 仅安装在了 CMD 对应的 Python 环境中,IDLE 关联的环境未安装 pySerial 的情况,可在 IDLE 中执行 pip show pyserial 确认安装状态。
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

