pip freeze 不支持 exclude 或 replace 语法,requirements.txt 中唯一有效锁定方式是使用 == 指定精确版本,如 requests==2.31.0;其他版本约束或配置文件关键字均无效,需靠命令行过滤或手动重装实现跳过升级。

pip freeze 本身不支持 exclude 或 replace 语法,所谓“在配置文件中使用 replace 属性防止更新”是常见误解——pip 的 requirements.txt 格式里根本不存在 replace 这个关键字,也不会识别它。
requirements.txt 里写 == 就是唯一有效的锁定方式
想固定某个包不被 pip install -U 或 pip install -r requirements.txt 升级,唯一可靠做法是显式声明精确版本:
-
requests==2.31.0:强制安装且仅接受该版本,任何升级操作都会跳过它(除非手动改写) -
torch==2.3.0+cu121:带构建标识的完整版本号也受支持,pip能正确解析 - 避免写
requests>=2.31.0或requests~=2.31.0:这些允许升级,起不到锁定作用
想跳过某些包升级?得靠命令行过滤,不是靠配置文件
当你执行批量升级(比如 pip list --outdated | xargs pip install -U),pip 不会读取 requirements.txt 做排除。真正可行的绕过方式只有:
- 用
--exclude参数(但注意:pip install -U不支持该参数;需改用pip install -U $(pip list --outdated --format=freeze | grep -v 'torch\|tensorflow' | cut -d= -f1)这类 shell 过滤) - 升级前先
pip freeze > before.txt,升级后再pip install torch==2.3.0+cu121手动重装锁定包 - 把不想动的包单独拎出来,用
pip install --force-reinstall --no-deps torch==2.3.0+cu121确保版本回填
为什么有人误信 “replace 属性”?
这个说法大概率混淆了其他工具的行为:
-
poetry的pyproject.toml支持replace字段,但那是 Poetry 内部解析逻辑,导出的requirements.txt仍只含==行 -
pip-tools的requirements.in可用-r引用或注释控制,也没有replace - 某些 IDE 插件或自研脚本可能伪造了类似语法,但原生
pip完全无视
真正需要长期锁定 CUDA 版本绑定的 PyTorch、特定 ABI 的 OpenCV,或者测试阶段必须卡死的旧版 Flask,唯一不翻车的做法就是:导出时确保 pip freeze 运行在干净虚拟环境里,且所有关键包都以 == 形式落在 requirements.txt 中——别指望配置文件里加个单词就能让 pip “理解你的意图”。











