Skip to content

安装 RandomWords 时出现 "No module named 'setuptools.command.test'" 的解决方法

问题描述

当使用 Python 3.12.4 和最新版 pip 尝试安装 RandomWords 包时:

bash
pip install RandomWords

会遇到以下错误:

Preparing metadata (setup.py) ... error
error: subprocess-exited-with-error
...
from setuptools.command.test import test as TestCommand
ModuleNotFoundError: No module named 'setuptools.command.test'

根本原因

此错误是由 setuptools 72.0.0 的重大变更引起的:

  1. RandomWords 的 setup.py 脚本引用了 setuptools.command.test 模块
  2. setuptools 在 v72.0.0 移除了该模块(后因兼容性问题已撤回)
  3. 此破坏性变更导致依赖该模块的包安装失败

注意

错误提示中的"note: This is an issue with the package mentioned above, not pip."表明问题根源在于包与 setuptools 新版本的兼容性

解决方案

✔️ 方法 1: 降级 setuptools (推荐通用方案)

最简单有效的解决方案是安装 72.0.0 之前的 setuptools 版本:

bash
# 安装兼容版本的 setuptools
pip install --upgrade "setuptools<72"

# 然后安装 RandomWords
pip install RandomWords

此操作显式限制 setuptools 使用 72.0.0 之前的版本

工作原理

"setuptools<72" 语法指定安装 72.0.0 之前的版本(如 71.1.0),避开了问题版本

🐳 方法 2: Docker/CI 环境解决方案

在 Dockerfile 或持续集成环境中,使用以下方案:

dockerfile
# 创建版本约束文件
RUN echo "setuptools<72" > constraints.txt

# 设置环境变量使 pip 遵守约束
ENV PIP_CONSTRAINT=constraints.txt

# 执行后续安装命令
RUN pip install RandomWords

📦 方法 3: Poetry 用户解决方案

Poetry 用户可使用临时命令绕过问题:

bash
# 生成约束文件
poetry export -o requirements.txt
poetry export -o constraints.txt -f constraints.txt

# 在约束下安装
PIP_CONSTRAINT="constraints.txt" poetry run pip install -r requirements.txt

🔧 方法 4: 使用 pip 参数解决方案

直接通过 pip 安装时添加特定参数:

bash
pip install --no-build-isolation --no-cache-dir "setuptools<72" RandomWords

参数说明:

  • --no-build-isolation:在系统环境中构建包
  • --no-cache-dir:避免使用缓存

解决方案对比指南

方法适用场景优势注意事项
降级 setuptools所有普通用户操作简单,一步到位需全局变更 setuptools
Docker/CI 方案容器化环境/构建流水线环境隔离,版本可控需配置约束文件
Poetry 方案使用 Poetry 管理的项目不破坏已有依赖管理步骤较多
pip 参数方案快速测试/临时安装无需额外文件参数复杂,需重复输入

后续发展

  • setuptools 72.0.0 于 2024 年 7 月末发布,但因破坏兼容性被迅速撤回
  • 该问题预计在 2024 年 11 月 setuptools 再次移除弃用模块时可能重现
  • 建议长期解决方案:
    1. 关注 RandomWords 的更新(是否修复 setup.py)
    2. 在项目依赖中显式声明 setuptools<72

提示:可通过 pip list 检查当前安装的 setuptools 版本,确认是否在 72.0.0 以下

这些解决方案均为临时性措施,建议在依赖包更新后恢复常规安装方式。实际应用中请根据您的环境选择最适合的方法。