使用OpenAI Whisper的Python程序打包失败求助
解决Whisper+Tkinter代码打包时的RecursionError问题
问题分析
你遇到的递归深度超限问题,核心原因是Whisper依赖的PyTorch、Transformers等库模块引用结构复杂,PyInstaller/py2app在解析依赖时容易触发递归限制;而且就算在spec里提高了递归上限,运行时加载模型的过程也可能再次触发错误。另外你原代码里在Tkinter回调函数中同步加载模型的写法,不仅会导致UI卡顿,还会加剧打包后的运行时递归冲突。
解决方案
1. 调整代码结构:提前加载模型+线程处理转录
把模型加载移到Tkinter主循环启动前,并用线程异步处理转录任务,既避免UI卡顿,也能缓解打包后的递归问题:
import whisper import tkinter as tk import tkinter.filedialog as filedialog import threading # 提前加载模型,避开回调函数内的动态加载逻辑 model = whisper.load_model("base") # 创建主窗口 root = tk.Tk() def transcribe_file(filepath): # 线程内执行转录 result = model.transcribe(filepath, fp16=False) # 切回主线程更新UI label.config(text=result["text"]) def select_file(): filepath = filedialog.askopenfilename() if not filepath: return # 启动线程处理转录,不阻塞UI threading.Thread(target=transcribe_file, args=(filepath,), daemon=True).start() # 创建选择文件按钮 button = tk.Button(root, text="选择文件", command=select_file) button.pack() # 设置标签最大宽度 max_width = 400 label = tk.Label(root, wraplength=max_width) label.pack() # 启动主循环 root.mainloop()
2. 优化PyInstaller配置
修改.spec文件,除了提高递归限制,还要显式声明依赖、排除冗余模块:
import sys # 进一步提高递归限制,比乘以5更稳妥 sys.setrecursionlimit(sys.getrecursionlimit() * 10) block_cipher = None a = Analysis( ['你的脚本文件名.py'], pathex=[], binaries=[], datas=[ # 手动下载Whisper模型到本地后,添加模型目录(示例路径) ('./base/', 'base/') ], hiddenimports=[ 'whisper', 'torch', 'transformers', 'more_itertools' ], excludes=[ 'torchvision', 'torchaudio' # 排除不需要的Torch子模块 ], cipher=block_cipher, ) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE( pyz, a.scripts, a.binaries, a.zipfiles, a.datas, name='Whisper转录工具', debug=False, console=True, # 不需要控制台窗口就改成False upx=True, )
打包时使用该spec文件:
pyinstaller 你的脚本文件名.spec
3. py2app配置调整
如果用py2app,修改setup.py如下:
from setuptools import setup import sys sys.setrecursionlimit(sys.getrecursionlimit() * 10) APP = ['你的脚本文件名.py'] DATA_FILES = [ ('base', './base/') # 加入本地模型目录 ] OPTIONS = { 'packages': ['whisper', 'torch', 'transformers'], 'excludes': ['torchvision', 'torchaudio'], 'plist': { 'CFBundleName': 'Whisper转录工具', 'CFBundleShortVersionString': '1.0.0', } } setup( app=APP, data_files=DATA_FILES, options={'py2app': OPTIONS}, setup_requires=['py2app'], )
打包命令:
python setup.py py2app
关键注意点
- 手动下载Whisper模型到本地,避免打包后运行时自动下载,既能解决递归问题,也能加快启动速度
- 用线程处理转录任务,彻底避免UI卡顿,同时减少主线程的递归压力
- 递归限制不要太保守,乘以10比乘以5更稳妥,但也不要设置过大引发其他异常
内容的提问来源于stack exchange,提问作者HNT
相关产品推荐
相关产品推荐

