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

基于大数据爬虫+Python+SpringBoot+Hive的网络电视剧收视率分析与可视化平台系统(源码+论文+PPT+部署文档教程等)

基于大数据爬虫+Python+SpringBoot+Hive的网络电视剧收视率分析与可视化平台系统(源码+论文+PPT+部署文档教程等)

博主介绍:ZEEKLOG毕设辅导第一人、全网粉丝50W+,ZEEKLOG特邀作者、博客专家、腾讯云社区合作讲师、ZEEKLOG新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文降重、长期答辩答疑辅导、腾讯会议一对一专业讲解辅导答辩、模拟答辩演练、和理解代码逻辑思路。 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟 2022-2024年最全的计算机软件毕业设计选题大全:

By Ne0inhk
详解RabbitMQ高级特性之延迟插件的安装和使用

详解RabbitMQ高级特性之延迟插件的安装和使用

目录 延迟队列插件 延迟队列插件的下载 延迟队列插件的安装  延迟队列插件的启用 编辑 添加配置 常量类 声明队列和交换机并绑定二者关系 编写生产消息代码 编写消费消息代码 观察效果 面试题 延迟队列插件 RabbitMQ官⽅也提供了⼀个延迟的插件来实现延迟的功能。 延迟队列插件的下载 插件下载链接---》链接 根据⾃⼰的RabbitMQ版本选择相应版本的延迟插件, 下载后上传到服务器。 查看RabbitMQ版本的命令 rabbitmqctl status | grep "RabbitMQ"  /usr/lib/rabbitmq/plugins 是⼀个附加⽬录, RabbitMQ包本⾝不会在此安装任何内容, 如果 没有这个路径, 可以⾃⼰进⾏创建。 延迟队列插件的安装  把下载好的 .ez文件上传到   /usr/lib/rabbitmq/

By Ne0inhk
Spring AI系列——开发MCP Server和MCP Client(SSE方式)

Spring AI系列——开发MCP Server和MCP Client(SSE方式)

文章目录 * 一、概述 * MCP架构图 * MCP生命周期 * 二、创建MCP SERVER的java工程 * 生成初始化工程代码 * 修改pom.xml文件 * 定义服务类MathTool * 通过配置类的方式把MathTool注入到Spring容器中 * 修改配置文件application.yaml * 启动服务 * 三、如何使用MCP Server * 方式一:使用Chatbox连接MCP Server * 设置AI模型提供方 * 配置MCP服务器 * 使用MCP Server * 方式二:开发一个Client来连接Server * 创建java工程 * 修改pom.xml,添加核心依赖 * 配置application.yaml * 创建Controller * 启动Client服务 * 访问接口进行测试 * 四、资料 一、概述 MCP架构图 MCP生命周期 二、创建MCP SERVER的java工程

By Ne0inhk
Go语言Map的两种Get操作:深入源码剖析实现原理

Go语言Map的两种Get操作:深入源码剖析实现原理

文章目录 * 前言 * 一、两种Get操作的基本语法 * 1.1 单值返回 * 1.2 双值返回 * 二、底层数据结构的奥秘 * 2.1 map的运行时表示 * 2.2 map的内存布局示意图 * 三、源码级别的实现剖析 * 3.1 单值返回的实现 * 3.2 双值返回的实现 * 3.3 两种实现的差异对比 * 四、编译器的魔法 * 4.1 语法糖的转换过程 * 4.2 性能优化的特殊路径 * 五、零值的奥秘 * 5.1 零值的底层实现 * 5.2 不同类型的零值处理 * 六、并发安全与内存模型 * 6.1 并发读的安全性

By Ne0inhk