更新virtualenv以匹配requirements.txt

buk*_*zor 5 python pip virtualenv requirements.txt

目前,当我们的项目的requirements.txt更新时,我们从头开始重新构建virtualenv以确保一致的结果.问题是我们的requirements.txt非常冗长,对它的更新通常只触及一个包.

是否有任何系统将virtualenv与requirements.txt进行比较并进行最少量的更改以使它们匹配?

我可以自己写这个,如果我能得到pip告诉我它安装哪个版本给出一个requirements.txt,但我没有看到这样的选项.

Jan*_*sky 5

通过pip install更新

我想知道,为什么简单

$ pip install -r requirements.txt --upgrade
Run Code Online (Sandbox Code Playgroud)

还不够吗?

它确实将当前的virtualenv与您的要求进行了比较,并且只进行了必要的更新.

删除不需要的包

关于删除不需要的包 - 真的有必要吗?如果你真的坚持它,我会创建unwanted-requirements.txt并在通过之前的调用更新包之前我会执行:

$ pip uninstall -r unwanted-requirements.txt
Run Code Online (Sandbox Code Playgroud)

然后是$ pip install ...`

如果你的系统保持一致,你的系统应该运行得很好,如果你犯了错误unwanted-requirements.txt,你的系统很可能存活,因为在大多数情况下,未使用的包装无害并且已经移除了所需的包装应该恢复随后$ pip install ...

加快安装速度

如果您真正关心的不仅是一致的安装,而且还要快速更新,那么如果加快工作速度,还有很好的工作方法.请参阅我的答案/sf/answers/1296451061/


Max*_*eev 1

我们这样做是这样的:当发出提交(我们使用 git)时,它会触发一个钩子,该钩子执行自定义编写的 bash 脚本,该脚本激活 virtualenv,运行 pip install -rrequirements.txt,检查所有内容是否都是最新的并安装仅需要升级并停用 virtualenv 的软件包。

我不知道这是否适合您,因为您没有发布有关您的环境的详细信息,但您明白了。另外,requirements.txt 的长度并不重要,因为与完全重建 virtualenv 时从头开始安装所有内容相比,pip 仅重新安装一些软件包。

编辑:

如果您还需要卸载不在requirements.txt中的软件包,您可以使用类似的方法:

pip freeze | grep -v -f requirements.txt - | xargs pip uninstall -y
Run Code Online (Sandbox Code Playgroud)

并且只有在那之后:

pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

  • `点冻结| grep -v -f 要求.txt - | xargs pip uninstall -y` 这行很有帮助 (2认同)