如何用Pipenv单独安装/更新指定包且不改动其他包版本?
我懂你这种头疼的情况——本来只想更新requests这一个包,结果用了pipenv update --selective-upgrade requests和pipenv update --keep-outdated requests之后,所有包的版本还是被改了,太闹心了!别着急,我来给你说正确的操作方式,以及为什么之前的命令没起作用。
一、添加单个包(不改动其他包版本)
如果只是要新增一个包,完全不用纠结,直接用这个命令就好:
pipenv install <package-name>
要是需要指定特定版本,就写成:
pipenv install <package-name>==<具体版本号>
这个命令会把新包添加到你的Pipfile和Pipfile.lock里,其他已经安装的包版本会原封不动,锁定过程也只会处理新包的依赖,不会碰其他包。
二、更新单个包(不改动其他包版本)
这才是你要的核心操作,正确的命令不是pipenv update,而是用pipenv install --upgrade:
pipenv install --upgrade <package-name>
如果你想直接升级到某个指定版本,也可以直接写:
pipenv install <package-name>==<目标版本号>
这个命令会只升级你指定的包到最新兼容版本(或你指定的版本),同时严格保留所有其他已安装包的当前版本,不会触发它们的更新——哪怕它们的Pipfile约束是宽松的(比如*)。
三、为什么之前的命令没效果?
你之前用的pipenv update系列命令,本质是基于Pipfile里的版本约束来更新依赖的。如果你的Pipfile里很多包的约束都比较宽松(比如requests = "*",其他包也是类似的无限制写法),哪怕加了--selective-upgrade或--keep-outdated,Pipenv在生成新的锁文件时,可能还是会因为你更新的包的依赖变化,去更新其他相关的包——这并不是命令失效,而是它在遵循Pipfile的约束逻辑。
而pipenv install --upgrade是完全基于当前已安装的包快照来操作的,它只会改动你指定的包及其直接必须更新的依赖,其他包一概不动,这才是真正的“仅更新单个包”。
验证方法
执行完命令后,你可以对比一下修改前后的Pipfile.lock文件,确认只有目标包(比如requests)和它的必要依赖版本发生了变化,其他包的版本和之前完全一致,就说明操作成功了。
内容的提问来源于stack exchange,提问作者jozo

