解决步骤如下,推荐采用源码安装并禁用构建隔离:
git clone https://github.com/openai/whisper.git
cd whisper
git checkout v20231117
pip install -e . --no-build-isolation
问题根源分析 问题的关键在于 PEP 517/518 构建隔离机制和你的 setup.py 实现方式。
1. 构建隔离机制 (Build Isolation) 的工作原理
当你执行 pip install -e .(不带 --no-build-isolation)时,pip 会:
- 创建一个临时的、干净的虚拟环境(在 /tmp/pip-build-env-xxx/)
- 在这个隔离环境中只安装 pyproject.toml 中 [build-system] 要求的包
- 在隔离环境中执行构建(运行 setup.py)
- 将构建产物安装到你的目标环境
2. 为什么你的构建会失败
看你的 setup.py 第 5 行:
import pkg_resources # 这行在构建的早期阶段就需要
问题出在第 30 行附近:
install_requires=requirements +[str(r)for r in pkg_resources.parse_requirements(open(os.path.join(os.path.dirname(__file__),"requirements.txt")))]
关键问题:pkg_resources.parse_requirements() 在模块导入级别就被执行了!
这意味着:
- Python 在解析 setup.py 时,立即执行了
import pkg_resources - 但在隔离的构建环境中,默认没有安装 setuptools
- 因此
pkg_resources不存在,导致ModuleNotFoundError
3. 构建环境 vs 目标环境的区别
┌─────────────────────┐ ┌─────────────────────┐ │ 目标虚拟环境 │ │ 隔离构建环境 │ │ (cosyvoice) │ │ (临时) │ ├─────────────────────┤ ├─────────────────────┤ │ ✓ setuptools 81.0.0 │ │ ✗ setuptools 未安装 │ │ ✓ pkg_resources │ │ ✗ pkg_resources │ │ ✓ 所有项目依赖 │ │ 只有构建基础包 │ └─────────────────────┘ └─────────────────────┘ ↑ ↑ └────── pip install -e . ──────┘ 需要同时满足两者
4. 为什么 --no-build-isolation 能解决
pip install -e . --no-build-isolation
这个命令告诉 pip:'不要创建隔离的构建环境,直接在当前激活的虚拟环境中构建'
于是流程变成:
目标虚拟环境 (cosyvoice) -> 直接在同一个环境中执行构建和安装
因为你的虚拟环境中已经有 setuptools,所以 import pkg_resources 可以成功执行。
5. 更好的修复方式
虽然 --no-build-isolation 解决了问题,但更好的做法是修改 setup.py,使其在隔离环境中也能工作:

