如何使用pip要求文件卸载以及安装包?

时间:2012-11-01 12:21:28

标签: python pip

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

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

这将允许pip需求文件成为包的规范列表 - “if if only only”方法。

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

的新功能

10 个答案:

答案 0 :(得分:96)

这应该卸载不在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年更新 不过,您可能并不想真正使用上述方法。 Check out pip-tools and pip-sync以更强大的方式完成你可能想做的事情。

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

2016年5月更新:

您现在也可以使用pip uninstall -r requirements.txt,但这基本上完全相反 - 它会卸载requirements.txt

中的所有内容

答案 1 :(得分:15)

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

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

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

答案 2 :(得分:8)

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

答案 3 :(得分:5)

您现在可以将-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.
...

答案 4 :(得分:3)

斯蒂芬的提议是一个好主意,但遗憾的是它不起作用 如果您只在文件中包含直接要求,则会发出声音 给我清洁。

将卸载所有依赖项, 甚至包括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钩子自动完成,但是我们不要偏离主题。

当然,使用一些包缓存系统是有道理的 或本地存储库,如pip2pi

答案 5 :(得分:2)

在这里抄袭@ stephen-j-fuhry是我使用的powershell等价物:

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

答案 6 :(得分:1)

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

(请注意,您可以使用requirements.txt导入现有的pipenv install -r requirements.txt。此后您应该拥有一个Pipfile,并且可以删除requirements.txt。)

答案 7 :(得分:1)

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

另一个答案中有一个pip-sync的临时引用,但值得自己回答,因为它可以精确地解决OP的问题。

pip-sync接受一个requirements.txt文件作为输入,并“调整”您当前的Python环境,使其与该requirements.txt中的内容完全匹配。这包括删除您环境中存在但requirements.txt中不存在的所有软件包。

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

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

但是我们的环境当前包含libClibD

> 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

答案 8 :(得分:1)

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

public async Task<List<Profile>> GetProfiles(IProgress<int> progress, ComboBox comboBox = null) { var request = new RestRequest("Profile", Method.GET); IRestResponse response = await client.ExecuteAsync(request); progress.Report(1); var data = new JsonDeserializer().Deserialize<List<Profile>>(response); comboBox.DataSource = data; return data; }

答案 9 :(得分:-5)

现在可以使用:

pip uninstall -r requirements.txt