一、问题背景与前因后果
1. 核心问题场景
我们有时候在执行 pip install -v -e .(可编辑模式安装本地项目)时,发现 pip 自动下载/升级 PyTorch(torch)版本,违背了“保留现有 torch 版本不改动”的核心需求(比如用户现有 torch 版本适配硬件/其他依赖,升级后可能导致环境冲突、代码报错)。


2. 问题根源
pip install -v -e . 的核心逻辑是读取项目根目录的依赖声明文件(setup.py/pyproject.toml/requirements.txt),并自动处理以下操作:
- 检查当前环境是否已安装声明的所有依赖;
- 若依赖未安装、版本低于声明的“最低要求”,或 pip 判定版本不兼容,会自动下载/升级对应依赖;
- nnUNet/医学影像类项目通常会在依赖中声明 torch>=x.x.x,pip 会默认按此规则更新 torch,即使现有版本已满足需求。
3. 潜在风险
- 强制升级 torch 可能导致与现有 CUDA/CUDNN 版本不兼容(如原本适配 cu113 的 torch 1.12.1 被升级为 cu118 的 torch 2.9.1,引发 GPU 调用失败);
- 破坏现有项目的依赖环境,导致其他基于旧 torch 开发的代码无法运行;
- 大体积 torch 包下载耗时,且可能覆盖原有安装文件,增加环境修复成本。
二、完整解决方案(按优先级排序)
方案1:核心方案——添加 –no-deps 参数(最简单、无副作用)
原理:–no-deps 强制 pip 仅安装项目本体(可编辑模式),完全跳过所有依赖的检查、下载和升级,从根源避免 torch 被改动。
执行命令:
# 完整命令:-v(详细日志) + -e .(可编辑安装) + –no-deps(跳过所有依赖)
pip install -v -e . –no-deps
补充操作:
由于 –no-deps 跳过了所有依赖安装,需手动补充项目必需的非 torch 依赖(避免运行报错),示例:
# 按需安装(以医学影像项目为例,根据自身setup.py调整)
pip install SimpleITK>=2.1.1 nibabel>=4.0.0 tqdm>=4.64.0 scipy>=1.7.3 pandas>=1.4.4

验证操作:
安装后确认 torch 版本未变,项目可正常导入:
import torch
import your_project # 替换为你的项目名
print("Torch版本:", torch.__version__) # 应显示原有版本
print("项目导入状态:", "成功" if 'your_project' in locals() else "失败")
方案2:精准方案——临时修改依赖配置(仅跳过torch,自动装其他依赖)
原理:修改项目的依赖声明文件,删除/注释 torch 相关条目,让 pip 仅处理其他依赖,不触碰 torch。
步骤1:修改依赖文件(二选一)
- 若项目用 setup.py:from setuptools import setup, find_packages
setup(
name="your_project",
version="0.1",
packages=find_packages(),
install_requires=[
# 注释/删除torch相关行,保留其他依赖
# "torch>=1.8.0", # 核心:移除torch依赖声明
"SimpleITK>=2.1.1",
"nibabel>=4.0.0",
"tqdm>=4.64.0"
]
) - 若项目用 pyproject.toml(PEP 621规范):[project]
name = "your_project"
version = "0.1"
dependencies = [
# "torch>=1.8.0", # 注释/删除torch行
"SimpleITK>=2.1.1",
"nibabel>=4.0.0"
]
步骤2:执行可编辑安装
pip install -v -e .
优势:自动安装除 torch 外的其他依赖,无需手动逐个安装;安装完成后可恢复原配置文件,不影响项目代码。
方案3:兜底方案——使用 –upgrade-strategy 限制升级
原理:通过 –upgrade-strategy only-if-needed 强制 pip 仅在依赖缺失时安装,已安装的依赖(包括 torch)即使版本略低,也不升级。
执行命令:
pip install -v -e . –upgrade-strategy only-if-needed
注意:此方案仅在现有 torch 版本满足项目依赖声明的“最低要求”时有效(如项目声明 torch>=1.8.0,现有版本为 1.12.1);若现有版本低于最低要求,仍会触发升级,因此优先级低于前两种方案。
三、关键验证与避坑
安装后执行 python -c "import torch; print(torch.__version__)",确认输出为原有版本。
- 不要省略 -e 参数:-e . 是可编辑安装的核心,省略后会将项目打包安装,失去“修改代码即时生效”的特性;
- 不要混用 –upgrade:若命令中包含 –upgrade,会强制升级所有依赖,包括 torch,需完全避免。
若上述方案仍无法避免 torch 改动,可通过 conda 创建独立虚拟环境,在新环境中安装与原环境同版本的 torch,再执行 pip install -v -e . –no-deps,完全隔离原环境。
总结
| –no-deps 参数 | 操作最简单、完全隔离依赖 | 已手动安装所有非torch依赖的场景 |
| 修改依赖配置 | 自动安装其他依赖、精准跳过torch | 需自动处理依赖,仅保留torch不动 |
| –upgrade-strategy | 无需修改配置 | 现有torch版本满足最低依赖要求 |
核心原则:–no-deps 是最稳妥的选择,可从根源避免 torch 被改动;若需自动安装其他依赖,优先修改依赖配置文件,确保仅跳过 torch 即可。



