我有一个在开发过程中发生变化的 pip 需求文件。
可以卸载pip
没有出现在需求文件中的包以及安装那些出现的包吗?有标准方法吗?
这将允许 pip 要求文件成为包的规范列表 - 一种“当且仅当”的方法。
更新:我在https://github.com/pypa/pip/issues/716建议将其作为新功能
我有一个在开发过程中发生变化的 pip 需求文件。
可以卸载pip
没有出现在需求文件中的包以及安装那些出现的包吗?有标准方法吗?
这将允许 pip 要求文件成为包的规范列表 - 一种“当且仅当”的方法。
更新:我在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 年更新:
不过,您可能并不想真正使用上述方法。检查pip-tools
并pip-sync
以更强大的方式完成您可能希望做的事情。
https://github.com/nvie/pip-tools
2016 年 5 月更新:
您现在也可以使用pip uninstall -r requirements.txt
,但这基本上是相反的——它卸载了requirements.txt
2019 年 5 月更新:
查看pipenv或Poetry。包管理领域发生了很多事情,使得这类问题有点过时了。不过,我实际上仍然很乐意使用 pip-tools。
您现在可以将-r requirements.txt
参数传递给pip uninstall
.
pip uninstall -r requirements.txt -y
至少从pip
8.1.2 开始,pip help uninstall
显示:
...
Uninstall Options:
-r, --requirement <file> Uninstall all the packages listed in the given requirements file. This option can be
used multiple times.
...
这不是 的功能pip
,不。如果你真的想要这样的东西,你可以编写一个脚本来比较pip freeze
你的输出requirements.txt
,但这可能比它的价值更麻烦。
使用virtualenv
,只需创建一个干净的环境并从 (重新)安装就更容易和更可靠requirements.txt
,例如:
deactivate
rm -rf venv/
virtualenv venv/
source venv/bin/activate
pip install -r requirements.txt
简短的回答是否定的,你不能用 pip 做到这一点。
这是一个古老的问题(但一个很好的问题),自从提出这个问题以来,情况已经发生了很大的变化。
在另一个答案中有一个临时参考pip-sync
,但值得拥有自己的答案,因为它恰好解决了 OP 的问题。
pip-sync将文件作为输入,并“调整”您当前的requirements.txt
Python 环境,使其完全requirements.txt
匹配. 这包括删除env 中存在但 requirements.txt
.
示例:假设我们希望我们的环境(仅)包含 3 个库:libA
、libB
和libC
,如下所示:
> cat requirements.txt
libA==1.0
libB==1.1
libC==1.2
但是我们的环境当前包含libC
and libD
:
> pip freeze
libC==1.2
libD==1.3
运行 pip-sync 将导致这个,这是我们想要的最终状态:
> pip-sync requirements.txt
> pip freeze
libA==1.0
libB==1.1
libC==1.2
Stephen 的提议是个好主意,但不幸的是,如果您在文件中只包含直接需求,它就行不通,这对我来说听起来更清晰。
所有依赖项都将被卸载,包括 even distribute
,分解pip
自身。
以下是我尝试对我的虚拟环境进行版本跟踪的方法。我尽量保持最低限度requirements.txt
,仅包括直接要求,甚至不提及我不确定的版本限制。
但除此之外,我在文件中保留并包含在版本跟踪(比如 git)中,我的 virtualenv 的实际状态venv.pip
。
这是一个示例工作流程:
设置 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
现在开始构建您的应用程序,然后提交并启动一个新分支:
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 hooks 自动化,但我们不要跑题。
当然,使用一些包缓存系统或本地存储库(如pip2pi)是有意义的
这是一个有效的简单解决方案:
pip uninstall $(pip freeze) -y
捎带 @stephen-j-fuhry 这里是我使用的 powershell 等效项:
pip freeze | ? { $_ -notmatch ((gc req.txt) -join "|") }
现在可以使用:
pip uninstall -r requirements.txt