答案是构建隔离机制导致:pip install . 默认启用pep 517隔离构建,创建临时环境,不继承当前conda环境中的torch和cuda配置,需设pip_no_build_isolation=1等参数禁用隔离或显式声明构建依赖。

pip install . 时找不到 torch 或 CUDA,大概率是构建隔离在作怪
当你确认 conda 环境里已装好 torch、cuda-toolkit,执行 pip install . 却报 ModuleNotFoundError: No module named 'torch',这不是环境没配好,而是 PEP 517 的隔离构建机制在起作用:pip 会启动一个临时干净环境来运行构建,它压根看不到你当前环境里的任何东西。
这种行为默认开启,且不提示。验证方式很简单:
pip install . -v 2>&1 | grep "Building wheel for"
如果看到类似 Creating build environment 或路径含 /tmp/pip-build-env-,就坐实了。
- 隔离环境只安装
pyproject.toml中[build-system].requires声明的构建依赖(如setuptools),不会继承主环境的torch、numpy等运行时依赖 - CUDA 编译器(
nvidia-cuda-toolkit)、nvcc路径、LD_LIBRARY_PATH等系统级配置,在隔离环境中全部丢失 - 即使你用
conda activate激活了环境,pip 的构建过程也完全不感知
禁用隔离构建:最直接有效的临时解法
对本地开发或 CI 调试阶段,关闭隔离是最快速的破局方式。关键不是“要不要隔离”,而是“现在是否需要它”——多数 AI 项目(如 GroundingDINO、Whisper)的 setup.py 或构建逻辑严重依赖主环境状态,强行隔离反而导致失败。
执行以下三步(顺序不能错):
- 设置
PIP_NO_BUILD_ISOLATION=1:告诉 pip 跳过创建临时构建环境 - 设置
PIP_USE_PEP517=0:回退到旧式非 PEP 517 构建流程(避免后端不兼容) - 加
--no-build-isolation参数:双重保险,覆盖可能的配置残留
完整命令示例:
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
export PIP_NO_BUILD_ISOLATION=1 export PIP_USE_PEP517=0 pip install . --no-build-isolation -v
注意:--no-deps 不建议加,除非你明确知道依赖已全量安装;否则可能漏掉 build-system.requires 之外但实际需要的构建时依赖(比如 cython)。
pyproject.toml 配置不当,会让隔离问题雪上加霜
很多项目把 pyproject.toml 当成摆设,只写了个空壳,结果 pip 在找不到合规配置时自动降级行为不可控——有时走隔离,有时又不走,调试起来像开盲盒。
必须确保以下两点:
-
[build-system]段中requires至少包含构建后端本身(如["setuptools>=61.0"]),且build-backend与之匹配(如"setuptools.build_meta") -
[project]段中name和version是强制字段,缺一不可;若项目用src/布局,name必须与src/<name></name>目录名严格一致(大小写、连字符都算)
常见错误配置:
[build-system] requires = ["setuptools"] # ❌ 版本太低,setuptools[project]<h1>❌ 缺少 name/version,python -m build 直接报错</h1>
长期方案:别绕过隔离,而是让它真正可用
禁用隔离只是权宜之计。企业级项目或开源发布必须回归隔离构建,否则 wheel 包在用户机器上大概率安装失败。真正的解法是让隔离环境“带齐装备再出发”:
- 把
torch、numpy等构建时强依赖,显式写进[build-system].requires(虽然它们本该是 runtime 依赖,但 CUDA 扩展编译真需要) - 用
build工具替代pip install .:它更专注构建,错误信息更清晰,且支持--installer pip指定 pip 版本 - CI 中统一用
tox验证:它天然强制隔离,能提前暴露“只在你本地能跑”的陷阱
最关键的细节常被忽略:隔离环境中的 PATH 和 LD_LIBRARY_PATH 不会自动继承主机设置。CUDA 项目必须通过 setup.py 的 os.environ 注入,或在 pyproject.toml 中用构建后端特定钩子(如 setuptools 的 [project.optional-dependencies] + 自定义 build_ext)传递编译器路径。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










