我有一个在开发过程中发生变化的pip需求文件。
pip
是否可以卸载不会出现在需求文件中的软件包以及安装那些出现的软件包?有标准方法吗?
这将允许pip需求文件成为包的规范列表 - “if if only only”方法。
的新功能答案 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 freeze
与requirements.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个库:libA
,libB
和libC
,如下所示:
> cat requirements.txt
libA==1.0
libB==1.1
libC==1.2
但是我们的环境当前包含libC
和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
答案 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