CosyVoice环境安装报错:安装openai-whisper时出现ModuleNotFoundError: No module named ‘pkg_resources‘的原因

先说如何解决,我个人采用源码安装,安装时禁用构建隔离:
git clone https://github.com/openai/whisper.git
cd whisper
git checkout v20231117
pip install -e . --no-build-isolation

再说该问题产生的原因,下面是大D老师的回答,自行参考。

太棒了!你找到了正确的解决方案。让我详细解释为什么会出现这个问题,以及为什么 --no-build-isolation 能解决它。

🔍 问题根源分析

问题的关键在于 PEP 517/518 构建隔离机制和你的 setup.py 实现方式。

1. 构建隔离机制 (Build Isolation) 的工作原理

当你执行 pip install -e .(不带 --no-build-isolation)时,pip 会:

1. 创建一个临时的、干净的虚拟环境(在 /tmp/pip-build-env-xxx/) 2. 在这个隔离环境中只安装 pyproject.toml 中 [build-system] 要求的包 3. 在隔离环境中执行构建(运行 setup.py) 4. 将构建产物安装到你的目标环境 

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 . ──────┘ 需要同时满足两者 

💡 为什么 --no-build-isolation 能解决

pip install-e. --no-build-isolation 

这个命令告诉 pip:“不要创建隔离的构建环境,直接在当前激活的虚拟环境中构建

于是流程变成:

┌─────────────────────┐ │ 目标虚拟环境 │ │ (cosyvoice) │ ├─────────────────────┤ │ ✓ setuptools 81.0.0 │ ←── 直接在同一个环境中执行构建 │ ✓ pkg_resources │ 和安装 │ ✓ 所有项目依赖 │ └─────────────────────┘ ↓ pip install -e . (无隔离环境) 

因为你的虚拟环境中已经有 setuptools,所以 import pkg_resources 可以成功执行。

📝 更好的修复方式

虽然 --no-build-isolation 解决了问题,但更好的做法是修改 setup.py,使其在隔离环境中也能工作:

import os import platform import sys from setuptools import find_packages, setup # 延迟导入 pkg_resources,或使用 try/exceptdefget_install_requires():"""延迟解析 requirements.txt,避免构建时依赖""" requirements =[]if sys.platform.startswith("linux")and platform.machine()=="x86_64": requirements.append("triton>=2.0.0,<3")# 只在需要时导入 pkg_resourcestry:import pkg_resources req_file = os.path.join(os.path.dirname(__file__),"requirements.txt")withopen(req_file, encoding="utf-8")as f: requirements.extend([str(r)for r in pkg_resources.parse_requirements(f)])except ImportError:# 降级方案:简单读取 requirements.txt req_file = os.path.join(os.path.dirname(__file__),"requirements.txt")withopen(req_file, encoding="utf-8")as f: requirements.extend([ line.strip()for line in f if line.strip()andnot line.startswith("#")])return requirements defread_version(fname="whisper/version.py"):exec(compile(open(fname, encoding="utf-8").read(), fname,"exec"))returnlocals()["__version__"] setup( name="openai-whisper", py_modules=["whisper"], version=read_version(), description="Robust Speech Recognition via Large-Scale Weak Supervision", long_description=open("README.md", encoding="utf-8").read(), long_description_content_type="text/markdown", readme="README.md", python_requires=">=3.8", author="OpenAI", url="https://github.com/openai/whisper", license="MIT", packages=find_packages(exclude=["tests*"]), install_requires=get_install_requires(),# 使用函数延迟解析 entry_points={"console_scripts":["whisper=whisper.transcribe:cli"],}, include_package_data=True, extras_require={"dev":["pytest","scipy","black","flake8","isort"]},)

🎯 总结

问题原因解决方案
ModuleNotFoundError: No module named 'pkg_resources'构建隔离环境中没有 setuptools,但 setup.py 在模块级别导入 pkg_resources1. ✅ --no-build-isolation 跳过隔离环境
2. 修改 setup.py 延迟导入 pkg_resources

你使用的 --no-build-isolation 是完全正确的临时解决方案。对于长期使用,可以考虑向项目提交 PR 修改 setup.py,使其构建时不需要预先存在的 setuptools。

Read more

AI智能证件照工坊WebUI使用教程:按钮功能与操作逻辑详解

AI智能证件照工坊WebUI使用教程:按钮功能与操作逻辑详解 1. 这不是PS,也不是照相馆——你真正需要的证件照解决方案 你有没有过这样的经历:临时要交简历,发现手机里只有一张糊糊的自拍;赶着办护照,却卡在“必须提供白底一寸照”这一步;或者帮家里老人准备材料,跑一趟照相馆要排队、等冲洗、再跑第二趟改尺寸……这些琐碎又高频的小事,其实早就不该花时间折腾。 AI智能证件照工坊就是为解决这些问题而生的。它不依赖云端上传、不把你的脸传给任何服务器,也不需要你打开Photoshop调图层、抠边缘、换背景、量尺寸——所有步骤都在你自己的电脑上安静完成。你上传一张生活照,点几下鼠标,30秒内就能拿到一张符合国家标准、边缘自然、尺寸精准的证件照。 这不是概念演示,而是已经打磨好的落地工具:它用的是工业级抠图引擎Rembg(基于U2NET),不是玩具模型;它支持红/蓝/白三色标准底,不是随便调个RGB值;它生成的1寸(295×413像素)和2寸(413×626像素)照片,直接能打印、能上传、

Python 操作 Cookie 完全指南,爬虫与 Web 开发实战

在 Python 开发中,Cookie 的应用主要分为两大场景:爬虫(模拟浏览器获取 / 携带 Cookie) 和Web 开发(给客户端设置 Cookie)。 一、爬虫场景:用 requests 库获取 / 携带 Cookie 爬虫中操作 Cookie 的核心需求是:模拟用户登录状态(如爬取需要登录的网站数据)、维持会话连接。requests 库是 Python 爬虫的首选工具,处理 Cookie 简洁高效。 1. 前置准备 先安装 requests 库(若未安装): pip install requests 2. 场景 1:获取网站返回的 Cookie 访问网站时,服务器会自动返回 Cookie,

昨天一口气面了3家前端岗,结果全凉了...

我提前准备了半个月,八股文背得滚瓜烂熟,Vue响应式原理、Event Loop、浏览器缓存策略倒背如流。结果一天三场面试,场场被问懵,面完出来脑子都是嗡嗡的。 先简单交代一下我的情况:5年前端经验,主要技术栈是Vue2/3 + React,做过电商、中后台项目,自认为基础还算扎实。这次想跳槽去个大厂或者中型公司,薪资期望35k左右。结果现实给我狠狠上了一课! 第一场,某二线大厂,一面就挂了。 面试官上来没问八股,直接扔了个场景: “我们有个活动页,双11高峰期预估PV 200万+,页面里有十几个弹窗组件,每个弹窗都有独立的业务逻辑和样式。现在的问题是,首屏加载很慢,用户滚动时卡顿明显。你从工程化、组件设计、渲染优化三个角度,给一套完整的优化方案。” 我当场就有点懵。脑子里想的都是“代码分割、按需加载、虚拟滚动”这些零散的点,但串不成一个完整的方案。面试官追问“弹窗组件怎么设计能减少渲染开销”,我答得磕磕巴巴,最后他礼貌地说“先这样吧”。 第二场,