我如何使用点子需求文件来卸载以及安装软件包?

我有一个在开发过程中发生变化的点子需求文件。

是否可以使用pip 卸载未出现在需求文件中的软件包以及安装那些出现的软件包? 有没有一个标准的方法?

这将允许点要求文件成为程序包的规范列表 – “如果且仅当”方法。

更新 :我build议它作为一个新function在https://github.com/pypa/pip/issues/716

简短的答案是否定的,你不能用点子来做到这一点。

这应该卸载不在requirements.txt中的任何东西:

 pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y 

虽然对于使用-e安装的软件包,也就是从git存储库或类似软件,这样做不太合适。 要跳过这些,只需过滤掉以-e标志开头的软件包:

 pip freeze | grep -v -f requirements.txt - | grep -v '^#' | grep -v '^-e ' | xargs pip uninstall -y 

那么显然:

 pip install -r requirements.txt 

2016年更新:尽pipe如此,您可能并不真的想要实际使用上述方法。 检查一下pip-toolspip-sync ,这些pip-tools可以完成你可能希望以一种更加强大的方式来完成的任务。

https://github.com/nvie/pip-tools

2016年5月更新:

您现在也可以使用pip uninstall -r requirements.txt ,但是这基本上完全相反 – 它将卸载requirements.txt所有内容

这不是一个pip的function,没有。 如果你真的想要这样的事情,你可以编写一个脚本来比较点击pip freeze的输出与你的requirements.txt ,但它可能会比它的价值更麻烦。

使用virtualenv ,只需创build一个干净的环境,并从requirements.txt安装(重新),比如:

 deactivate rm -rf venv/ virtualenv venv/ source venv/bin/activate pip install -r requirements.txt 

斯蒂芬的build议是一个不错的主意,但不幸的是,如果你只在文件中包含直接需求,这听起来就比较清洁。

所有的依赖关系将被卸载,甚至包括distribute ,分解本身。

在跟踪虚拟环境的版本中维护一个干净的需求文件

以下是我如何尝试版本跟踪我的虚拟环境。 我尽量保持一个最低限度的requirements.txt ,只包括直接需求,甚至在我不确定的时候甚至不提及版本限制。

但是,除此之外,我保留并在版本跟踪(如git)中包含我的virtualenv的实际状态在venv.pip文件中。

以下是一个示例工作stream程:


设置virtualenv工作区,版本跟踪:

 mkdir /tmp/pip_uninstalling cd /tmp/pip_uninstalling virtualenv venv . venv/bin/activate 

初始化版本跟踪系统:

 git init echo venv > .gitignore pip freeze > venv.pip git add .gitignore venv.pip git commit -m "Python project with venv" 

安装一个依赖包,将其包含在需求文件中:

 echo flask > requirements.txt pip install -r requirements.txt pip freeze > venv.pip 

现在开始构build你的应用程序,然后提交并启动一个新的分支:

 vim myapp.py git commit -am "Simple flask application" git checkout -b "experiments" 

安装一个额外的包:

 echo flask-script >> requirements.txt pip install -r requirements.txt pip freeze > venv.pip 

…玩它,然后回到较早的版本

 vim manage.py git commit -am "Playing with flask-script" git checkout master 

现在卸载无关的软件包:

 pip freeze | grep -v -f venv.pip | xargs pip uninstall -y 

我想这个过程可以通过git钩子自动化,但是我们不要脱离主题。

当然,使用一些包caching系统或像pip2pi这样的本地存储库是有意义的

在这里捎带@stephen-j-fuhry是一个相当于我使用的powershell:

 pip freeze | ? { $_ -notmatch ((gc req.txt) -join "|") } 

现在可以使用:

 pip uninstall -r requirements.txt