Python3.9下pyenchant与SAPI.SpVoice因libstdc++-6.dll冲突解决方案问询
解决方案
以下两种方案均不需要大幅修改现有业务代码,可快速解决DLL版本冲突问题:
方案1:修改pyenchant依赖的DLL名称(一劳永逸,业务代码零修改)
核心思路是将pyenchant依赖的libstdc++-6.dll改名,同时修改pyenchant底层库的导入表,让两个组件分别加载独立的DLL文件:
- 找到pyenchant安装目录(虚拟环境下通常为
venv/Lib/site-packages/enchant/),将目录下自带的libstdc++-6.dll重命名为libstdc++_enchant.dll - 用
CFF Explorer或Dependency Walker等工具打开同目录下的_enchant.pyd(或libenchant-2.dll,因版本不同可能有差异),在导入表中找到对libstdc++-6.dll的依赖项,将依赖名称修改为libstdc++_enchant.dll后保存 - 直接运行原有业务代码即可,无需做任何其他修改
方案2:子进程封装语音调用(无需修改本地库文件,仅需调整少量封装代码)
核心思路是将SAPI语音逻辑剥离到独立子进程运行,和主进程的pyenchant环境完全隔离,上层调用逻辑保持不变:
- 新建独立的语音执行脚本
speak_worker.py,代码如下:
import sys import win32com.client speaker = win32com.client.Dispatch("SAPI.SpVoice") def speak(text): voices = speaker.GetVoices("Language = 409", 'Gender = Male') for voice in voices: desc = voice.GetDescription() if "Eric" in desc: speaker.Voice = voice speaker.Speak(text) break if __name__ == "__main__": text = sys.argv[1] speak(text)
- 将原有代码中的
speaktest函数替换为以下实现:
import subprocess import sys def speaktest(text): subprocess.run( [sys.executable, "speak_worker.py", text], capture_output=True, text=True )
- 原有上层调用逻辑完全不需要改动,直接运行即可。
内容的提问来源于stack exchange,提问作者Megan Caithlyn
相关产品推荐
相关产品推荐

