一、问题背景与前因后果
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 被改动。
执行命令:
bash
# 完整命令:-v(详细日志) + -e .(可编辑安装) + --no-deps(跳过所有依赖)
pip install -v -e . --no-deps
补充操作 :
由于 --no-deps 跳过了所有依赖安装,需手动补充项目必需的非 torch 依赖(避免运行报错),示例:
bash
# 按需安装(以医学影像项目为例,根据自身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 版本未变,项目可正常导入:
python
import torch
import your_project # 替换为你的项目名
print("Torch版本:", torch.__version__) # 应显示原有版本
print("项目导入状态:", "成功" if 'your_project' in locals() else "失败")
方案2:精准方案------临时修改依赖配置(仅跳过torch,自动装其他依赖)
原理:修改项目的依赖声明文件,删除/注释 torch 相关条目,让 pip 仅处理其他依赖,不触碰 torch。
步骤1:修改依赖文件(二选一)
-
若项目用
setup.py:pythonfrom 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规范):toml[project] name = "your_project" version = "0.1" dependencies = [ # "torch>=1.8.0", # 注释/删除torch行 "SimpleITK>=2.1.1", "nibabel>=4.0.0" ]
步骤2:执行可编辑安装
bash
pip install -v -e .
优势:自动安装除 torch 外的其他依赖,无需手动逐个安装;安装完成后可恢复原配置文件,不影响项目代码。
方案3:兜底方案------使用 --upgrade-strategy 限制升级
原理 :通过 --upgrade-strategy only-if-needed 强制 pip 仅在依赖缺失时安装,已安装的依赖(包括 torch)即使版本略低,也不升级。
执行命令:
bash
pip install -v -e . --upgrade-strategy only-if-needed
注意 :此方案仅在现有 torch 版本满足项目依赖声明的"最低要求"时有效(如项目声明 torch>=1.8.0,现有版本为 1.12.1);若现有版本低于最低要求,仍会触发升级,因此优先级低于前两种方案。
三、关键验证与避坑
- 验证torch版本未变 :
安装后执行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 即可。