我如何使用点子需求文件来卸载以及安装软件包?
我有一个在开发过程中发生变化的点子需求文件。
是否可以使用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-tools
和pip-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