python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > pip install -e.出现xxx module not found error

pip install -e.出现xxx module not found error的问题解决方案

作者:Tipriest_

这篇文章主要介绍了pip install -e.出现xxx module not found error的问题解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

问题说明与解决方案

在本地安装wheeled_lab这个包的时候一直出现toml module找不到的错误,但是不管是conda的环境还是python的基本环境都已经安装过了toml包,后来发现是Python包在构建时的构建标准问题。

Python 包安装系统正在从旧的 setup.py 方式过渡到新的 PEP 517/518 标准(使用 pyproject.toml)。

当在ubuntu22.04运行 pip install -e . 时,pip 会尝试使用现代的 PEP 517 标准来构建你的包。这个过程会创建一个临时的、隔离的构建环境。你的项目的构建过程(即使只是为了获取元数据)依赖于 toml 这个包(通常是 setup.py 内部需要读取 pyproject.toml 文件),但这个临时的构建环境里并没有预装 toml,因此导致了 ModuleNotFoundError,整个安装过程就失败了。

添加 pyproject.toml

更长期的解决方案是为你的项目添加一个 pyproject.toml 文件。在项目根目录(wheeledlab 目录)创建 pyproject.toml 文件,内容如下:

[build-system]
requires = ["setuptools>=64.0.0", "wheel"]
build-backend = "setuptools.build_meta"

然后重新安装:

pip install -e .

问题原因详细解释

这个方法很好地解决了我的问题,更详细地解释一下问题出现的原因:

pip 在构建你的包时,并不会使用你当前的 conda 环境 (WL),而是创建了一个临时的、隔离的“构建环境”(Isolated Build Environment)。

详细解释:

1.过去的方式(你所预期的行为)

2.现在的方式(实际发生的情况)

这个新标准的核心思想就是 构建隔离 (Build Isolation)。

当你运行 pip install -e . 时,pip 会执行以下步骤:

安装构建依赖:

总结与类比

你可以把这个过程想象成去一个高科技实验室做实验:

所以,即使你的个人工作室 (WL 环境) 里有 toml,但无菌操作台(隔离构建环境)里一开始是没有的。pyproject.toml 的作用就是告诉 pip 该往这个无菌操作台里准备些什么。

使用什么标准安装取决于什么

那么到底是用setup.py安装还是PEP 517/518标准安装取决于什么呢,Ubuntu系统版本,Python版本,setuptools版本还是什么

在 Python 生态中,setup.py 安装 vs. PEP 517/518 标准安装的选择取决于多个因素,但核心是由 pipsetuptools 版本和项目配置共同决定的,而不是直接由 Ubuntu 系统版本或 Python 版本决定。

以下是详细分析:

1. 关键决定因素

因素影响方式
pip 版本现代 pip(≥19.0)默认启用 PEP 517/518,旧版可能回退到 setup.py
setuptools 版本新版 setuptools(≥40.8.0)支持 PEP 517/518,旧版可能仅支持 setup.py
项目配置存在 pyproject.toml 时优先用 PEP 517/518,否则回退到 setup.py
Python 版本间接影响(Python ≥3.7 原生支持 PEP 517/518,但旧版可通过工具链支持)
系统环境几乎无直接影响(除非系统强制锁定了 pip/setuptools 版本)

2. 具体行为规则

(1) 当项目有pyproject.toml时

[build-system]
requires = ["setuptools>=61.0", "wheel"]  # 必须显式声明构建依赖
build-backend = "setuptools.build_meta"   # 使用 setuptools 作为后端

(2) 当项目无pyproject.toml时

pip ≥19.0:回退到传统 setup.py 方式(非隔离环境)。

3. 版本兼容性对照表

工具/配置支持 PEP 517/518 的最低版本备注
pip≥19.0 (2019)旧版需升级:python -m pip install -U pip
setuptools≥40.8.0 (2018)新版推荐 ≥61.0
Python≥3.7 (官方支持)更低版本可通过工具链支持
pyproject.toml无版本要求文件存在即触发 PEP 517/518

4. 如何强制选择安装方式?

(1) 强制使用传统setup.py(不推荐)

pip install -e . --no-use-pep517

(2) 强制使用 PEP 517/518

pip install -e . --use-pep517

5. 为什么你的案例中toml在主环境无效?

根本原因:PEP 517/518 的隔离构建机制。

6. 最佳实践建议

始终添加 pyproject.toml

[build-system]
requires = ["setuptools>=64.0", "wheel"]
build-backend = "setuptools.build_meta"

升级工具链

python -m pip install -U pip setuptools wheel

避免混合使用新旧方式

总结

决定性因素pyproject.toml 存在与否 + pip/setuptools 版本。

系统/Python 版本:仅影响工具链的默认版本,不直接决定行为。

解决方案:显式声明依赖(pyproject.toml)并保持工具链更新。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文