Python 3.9环境下同时使用bleak与pyttsx3触发OSError问题咨询
错误原因
该报错仅出现在Windows平台,是COM组件的线程模式冲突导致,具体逻辑如下:
- bleak在Windows环境下依赖WinRT接口实现蓝牙低功耗通信,模块导入时会自动将当前线程的COM模式设置为多线程单元(MTA)
- pyttsx3底层调用Windows SAPI语音接口,
pyttsx3.init()执行时要求当前线程必须为*单线程单元(STA)*模式 - Windows COM规则规定线程模式一旦设置就无法修改,因此先导入bleak再初始化pyttsx3时就会触发该报错
解决方法
方案1:调整初始化顺序(最简单适配方案)
优先完成pyttsx3的初始化操作,再导入bleak,bleak的WinRT实现兼容STA线程模式,不会触发冲突。
示例代码:
import pyttsx3 # 先初始化pyttsx3 engine = pyttsx3.init() # 再导入并使用bleak import bleak # 后续业务逻辑
方案2:将pyttsx3逻辑放在独立STA线程中运行
如果业务逻辑要求必须先加载bleak,可以将pyttsx3的所有操作放到单独指定为STA模式的子线程中运行,避免线程模式冲突。
该方案需要先安装pywin32依赖,执行pip install pywin32即可
示例代码:
import threading import pythoncom import pyttsx3 import bleak def tts_task(): # 子线程初始化COM为STA模式 pythoncom.CoInitializeEx(pythoncom.COINIT_APARTMENTTHREADED) engine = pyttsx3.init() # 执行语音相关操作 engine.say("测试语音") engine.runAndWait() # 释放COM资源 pythoncom.CoUninitialize() # 主线程可正常使用bleak # 启动独立线程处理语音 tts_thread = threading.Thread(target=tts_task) tts_thread.start() tts_thread.join()
方案3:使用多进程隔离运行
如果上述方案都不满足需求,可以将bleak和pyttsx3的逻辑分别放在两个独立进程中运行,进程之间的COM环境完全隔离,不会出现模式冲突。
内容的提问来源于stack exchange,提问作者Val Gretchev
相关产品推荐
相关产品推荐

