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

数据库迁移 TCO 全景账本:MySQL 替代中的隐性成本与工程化工具链实测

数据库迁移 TCO 全景账本:MySQL 替代中的隐性成本与工程化工具链实测

文章目录 * 前言:决策者的“隐形焦虑”与迁移困局 * 一、 TCO 全景账本:隐性成本都藏哪儿了? * 1. 成本结构深度对比 * 2. 效率数据实测 * 二、 迁移主力军:KDTS 自动化迁移深度解析 * 1. 核心黑科技:智能映射与兼容 * 2. 实战流程:让迁移可复用、可验收 * 三、 零停机保障:KFS 双轨增量同步与“后悔药” * 1. 架构原理:双轨运行,进退自如 * 2. 实战演示:KFS 任务配置与验证 * 四、 最后一公里:一致性校验与修复怎么做(验收闭环) * 1) 迁移报告先把问题前置 * 2) 同步链路侧做一致性比对与修复 * 3) 业务侧做关键指标对账(强烈建议) * 五、 结语:

优雅终结启动顺序噩梦:ObjectProvider —— Spring 4.3 开始引入

优雅终结启动顺序噩梦:ObjectProvider —— Spring 4.3 开始引入

🧑 博主简介:ZEEKLOG博客专家,「历代文学网」(PC端可以访问:https://lidaiwenxue.com/#/?__c=1000,移动端可关注公众号 “ 心海云图 ” 微信小程序搜索“历代文学”)总架构师,首席架构师,也是联合创始人!16年工作经验,精通Java编程,高并发设计,分布式系统架构设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。 🤝商务合作:请搜索或扫码关注微信公众号 “ 心海云图 ” 优雅终结启动顺序噩梦:ObjectProvider —— Spring 4.3 开始引入 从“饥渴式依赖”到“按需获取”,一次依赖注入的思想跃迁 缘起:一个再普通不过的配置类,为何启动就报错?

ASP.NET Core Web API 发布到 IIS 服务器

目录 一、发布项目 二、创建应用程序池 三、创建网站 四、解决错误 在 VS 2022 中,创建一个 ASP.NET Core Web API 项目,项目我就使用默认的代码,没有添加任何代码,也没修改任何配置文件,系统我使用的是我自己的电脑,Win11 系统,如果是 Windows 服务器系统,比如:Windos Server,用法也大差不差。 至于如何创建项目,可以看看我之前的帖子: https://blog.ZEEKLOG.net/qq_38693757/article/details/127024492?spm=1001.2014.3001.5502 目前我创建的项目用的是

然然管理系统-双前端加持!基于Ant Design Vue 4.x的前端正在开发中

然然管理系统-双前端加持!基于Ant Design Vue 4.x的前端正在开发中

在企业级管理系统开发领域,技术栈的选择往往决定了开发效率、系统稳定性和用户体验。今天给大家推荐一款兼顾灵活性与实用性的管理系统 ——然然管理系统,后端基于 SpringBoot+MyBatisPlus 构建稳定高效的服务层,前端不仅适配了经典的 Vue3+Element-Plus,更全新规划了 Antd4.x 版本的前端实现,给开发者多一份选择,多一份适配空间! 正在开发中的新前端简单截图如下 一、技术栈全景:主流组合,高效开发 然然管理系统的技术选型紧跟行业主流,兼顾 “开发效率” 与 “企业级适配”,核心技术栈如下: 🔧 后端核心 * SpringBoot:采用轻量级的 SpringBoot 框架(注:当前 SpringBoot 主流版本为 3.x,系统基于其核心生态构建),快速搭建后端服务,自动配置、内嵌容器等特性大幅降低开发成本,同时保证服务的稳定性和可扩展性。 * MyBatisPlus:作为 MyBatis 的增强工具,彻底简化