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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:10:59