110

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

可以卸载pip没有出现在需求文件中的包以及安装那些出现的包吗?有标准方法吗?

这将允许 pip 要求文件成为包的规范列表 - 一种“当且仅当”的方法。

更新:我在https://github.com/pypa/pip/issues/716建议将其作为新功能

4

10 回答 10

149

这应该卸载不在 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-toolspip-sync以更强大的方式完成您可能希望做的事情。

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

2016 年 5 月更新:

您现在也可以使用pip uninstall -r requirements.txt,但这基本上是相反的——它卸载了requirements.txt

2019 年 5 月更新:

查看pipenvPoetry。包管理领域发生了很多事情,使得这类问题有点过时了。不过,我实际上仍然很乐意使用 pip-tools。

于 2013-03-29T17:55:35.343 回答
23

您现在可以将-r requirements.txt参数传递给pip uninstall.

pip uninstall -r requirements.txt -y

至少从pip8.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.
...
于 2018-10-28T13:41:07.457 回答
22

这不是 的功能pip,不。如果你真的想要这样的东西,你可以编写一个脚本来比较pip freeze你的输出requirements.txt,但这可能比它的价值更麻烦。

使用virtualenv,只需创建一个干净的环境并从 (重新)安装就更容易和更可靠requirements.txt,例如:

deactivate
rm -rf venv/
virtualenv venv/
source venv/bin/activate
pip install -r requirements.txt
于 2012-11-01T13:20:48.403 回答
17

简短的回答是否定的,你不能用 pip 做到这一点。

于 2012-11-01T17:36:45.050 回答
4

这是一个古老的问题(但一个很好的问题),自从提出这个问题以来,情况已经发生了很大的变化。

在另一个答案中有一个临时参考pip-sync,但值得拥有自己的答案,因为它恰好解决了 OP 的问题。

pip-sync将文件作为输入,并“调整”您当前的requirements.txtPython 环境,使其完全requirements.txt匹配. 这包括删除env 中存在但 requirements.txt.

示例:假设我们希望我们的环境(仅)包含 3 个库:libAlibBlibC,如下所示:

> cat requirements.txt
libA==1.0
libB==1.1
libC==1.2

但是我们的环境当前包含libCand 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
于 2019-04-15T18:45:09.853 回答
3

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)是有意义的

于 2015-02-24T13:23:20.640 回答
3

这是一个有效的简单解决方案:

pip uninstall $(pip freeze) -y

于 2021-01-19T15:44:25.240 回答
2

捎带 @stephen-j-fuhry 这里是我使用的 powershell 等效项:

pip freeze | ? { $_ -notmatch ((gc req.txt) -join "|") }
于 2014-03-13T12:22:30.997 回答
0

虽然这并不能直接回答问题,但requirements.txt现在更好的替代方法是使用Pipfile. 它的功能类似于 Ruby Gemfile。目前,您需要使用该pipenv工具,但希望最终将其纳入pip. 这提供了pipenv clean执行您想要的命令。

(请注意,您可以使用 导入现有requirements.txtpipenv install -r requirements.txt。在此之后,您应该有 aPipfile并且requirements.txt可以删除。)

于 2019-03-25T19:58:46.103 回答
-4

现在可以使用:

pip uninstall -r requirements.txt
于 2016-07-19T12:58:04.067 回答